web-dev-qa-db-ja.com

iOS 5ストーリーボードでカスタムプロトタイプスタイルテーブルセルを初期化する方法は?

IOS 5とストーリーボードに変換しています。デフォルトのセルスタイルのテーブルビューがある場合、すべて正常に動作します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifierFromStoryboard"];
    }
    return cell;
}

「if(cell == nil)」ブロックが削除される例を見てきました。ただし、それを取り出すと、「UITableView dataSourceはtableView:cellForRowAtIndexPath:からセルを返す必要があります」というメッセージでアプリがクラッシュします。上記のように機能するため、これは問題ではありません。

私の問題は、セルにカスタムスタイルを使用したいため、initWithStyleを使用できないことです。ストーリーボードでデザインしたカスタムセルを初期化するにはどうすればよいですか?

古い5以前のアプリには、このようなものを使用するペン先とクラスがありましたが、今はストーリーボードを使用しています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomTableCell *cell = (MyCustomTableCell *) [tableView dequeueReusableCellWithIdentifier:@"MyCustomIdentifier"];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" owner:self options:nil];
        cell = (MyCustomTableCell *) [nib objectAtIndex:0];
    }
    return cell;
}
36
Tom Kincaid

こちらです

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    return cell;
}
39
Alex

これは私にとって完璧に機能しました(Xcode 4.5.2およびiOS 6.0):

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

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

    UILabel *title = (UILabel*) [cell viewWithTag:1000];
    UILabel *summary = (UILabel*) [cell viewWithTag:1001];
    [title setText:[ tableMainTitle objectAtIndex:indexPath.row]];
    [summary setText:[ tableSubTitle objectAtIndex:indexPath.row]];
    return cell;
}

重要:デリゲートとデータソースの設定を忘れないでください。

9
OSXMonk

以下を使用してTableViewを含むView Controllerをロードする場合:

MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

次に、cellForRowAtIndexPathの中に、1行だけが必要です。

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

dequeueReusableCellWithIdentifierは、セルが存在しない場合に1つのセルをインスタンス化します。

8
jemeshsu

これは非常にうまく機能すると思います。私はしばらくの間それを回避しようとしていましたが、それはうまくいきました。

だから私はこれをやっていたので、それがうまくいかなかった理由です

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

したがって、UITableViewCellの代わりにクラスでセルを割り当てます。上記の例「CustomCell」

再度、感謝します

0
fftoolbar
static NSString *identifier=@"SearchUser";
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell==nil)
{
    cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;
0
Anand