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;
}
こちらです
- (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;
}
これは私にとって完璧に機能しました(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;
}
重要:デリゲートとデータソースの設定を忘れないでください。
以下を使用してTableViewを含むView Controllerをロードする場合:
MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
次に、cellForRowAtIndexPath
の中に、1行だけが必要です。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];
dequeueReusableCellWithIdentifier
は、セルが存在しない場合に1つのセルをインスタンス化します。
これは非常にうまく機能すると思います。私はしばらくの間それを回避しようとしていましたが、それはうまくいきました。
だから私はこれをやっていたので、それがうまくいかなかった理由です
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
したがって、UITableViewCellの代わりにクラスでセルを割り当てます。上記の例「CustomCell」
再度、感謝します
static NSString *identifier=@"SearchUser";
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell==nil)
{
cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;