iOS6以降でのUITableViewのセル再利用

ようやく理解できたので書きます。

以前、UITableViewでのUITableViewCellの生成方法を記載しましたがiOS6以降はUICollectionViewの追加に合わせてセルの再利用の方法も追加されていました。

以前書いたセル生成

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

UICollectionViewCellの生成

UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Hoge" forIndexPath:indexPath];

iOS6以降でのUITableViewCellの生成方法

dequeueReusableCellWithReuseIdentifier:forIndexPathを使います。

公式リファレンス

Apple Developer Documentation

dequeueReusableCellWithReuseIdentifierを使用したセル生成では、指定したIdentifierのセルが存在しない場合返り値はnilです。
その為nilを考慮した記述をする必要がありました。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

nilが帰ってきた場合はセルを生成しています。

dequeueReusableCellWithReuseIdentifier:forIndexPathでは予めIdentifierを設定したセルを用意する必要があるため必ず返り値はUITableViewCellになります。
Identifierを設定したUITableViewCellがないとビルドが通りません。
これは↑でUICollectionViewCellの時に遭遇した記事を貼っていますがそれと同じことです。

公式リファレンスでも触れられています。

Important: You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.

参考リンク先でも記載されていますがコード上でIdentifierを設定する際は下記をviewDidLoad内に記述します。

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

StoryBoardで設定することも出来ます。StoryBoardでUITableViewCellを指定した時に
Attributes inspecterのIdentifierに記述すればOKです。
f:id:arcright:20140903141220p:plain

StoryBoardでSegueを使った簡単な画面遷移

UITableViewを使いを表示してセルがタップされたら詳細画面に遷移。詳細画面からは一覧画面に戻れるナビゲーションができるような遷移です。
Master-Detail Applicationのテンプレート使うと一瞬で作ってくれるのですけども何が起きてるかよくわからないので自分で作ります。

Master-Detail Applicationってこれです。
f:id:arcright:20140903165411p:plain

作り方

1. プロジェクト作成

SingleViewApplicationのテンプレート使って作成します。
f:id:arcright:20140903165549p:plain

2. StoryBoardでNavigationControllerを追加

デフォルトでViewControllerが1つあると思うんですがこれは詳細画面に使おうと思うのでそのままで、ObjectLibraryからNavigationControllerを追加します。TableViewControllerもおまけでついてきます。
f:id:arcright:20140903170258p:plain

追加されたらNavigationControllerをInitialViewControllerにします。
f:id:arcright:20140903172718p:plain

3. TableViewControllerに対応したClass作成

StoryBoardに追加した物をソースコードで操作するには関連付けが必要なんです。今回はUITableViewControllerのサブクラスを作成します。

ProjectNavigatorのディレクトリを右クリック>NewFileを選択。
f:id:arcright:20140903171101p:plain
f:id:arcright:20140903171259p:plain
まあこんな感じでMasterTableViewControllerという名前で作ります。

4. 関連付け

TableViewControllerを選択した状態でIdentityinspecterのCustomClassに先ほど作ったMasterTableViewControllerを設定します。
f:id:arcright:20140903171746p:plain

5. UITableViewにデータを表示

UITableViewにデータを表示してみます。MasterTableViewController.mを編集します。UITableViewControllerのサブクラスとして作っているのでメソッドの雛形が書かれているはずです。
1つセルがあればいいので両方1にしてwarningを消します。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 1;
}

続いてcellForRowAtIndexPathでセルの設定をします。なんでもいいのでhogeと表示します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = @"hoge";
    
    return cell;
}

Identifierを設定しておく必要がありますのでUITableViewCellのIdentifierに"Cell"を設定します。
f:id:arcright:20140903175127p:plain
シミュレータを起動するとこんな感じになります。
f:id:arcright:20140903172924p:plain

6. Segueを設定

下記の通りドラッグアンドドロップするとウィンドウが表示されますのでpushを選択するとSegueができます。
f:id:arcright:20140903173448p:plain

SegueにIdentifierを設定します。Segueを選択した状態でAttributesInspecterから設定します。Hogeにしときます。
f:id:arcright:20140903173631p:plain

7. セルを選択した時の動作

MasterTableViewController.mにdidSelectRowAtIndexPathを実装します。これはセルをタップした際に呼ばれます。
先ほど設定したIdentifierを指定してperfoemSegueWithIdentifierを使います。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [self performSegueWithIdentifier:@"Hoge" sender:self];
}

完成

f:id:arcright:20140903173926p:plain
f:id:arcright:20140903173937p:plain

感想

難しいですね。

A8セルフバックとA8.net本人申込可プログラムは別物

A8.netに限らず一般的なアフィリエイトは、広告を自身が運営するWebサイトやブログに掲載して訪問者に広告のリンクサービスを利用してもらう等成果を上げると報酬が発生する仕組みです。

本来広告を貼っている人自身での申込は、禁止または報酬対象外になりますが、自身での申込が許可されてるのが「A8セルフバック」と「本人申込可プログラム」になります。

A8セルフバックとは

A8.netが提供している「A8セルフバック」は名前の通りなんですが自身でサービスを利用して報酬を受け取ることができるサービス。
利用するのにWebサイトやブログを持っている必要はありません。A8.netの会員である必要はあります。

A8.net本人申込可プログラムとは

A8.netに登録を行い、広告プログラムと提携すると広告を掲載できるようになります。
本人申込可プログラムとは、広告を自身のWebページ、ブログに掲載した後自分でクリックして広告先のサービスを利用して報酬を受け取ることが可能なプログラムのことです。

A8.netの管理画面で報酬欄に「一般AS」「セルフバック」と記載がある場合、本人申込の場合は「一般AS」に該当します。
一般ASとセルフバックで報酬額が異なる場合が多いので、申し込む際はどちらに属しているかははっきりさせておいたほうがよいでしょう。