使用 Storyboard 中的 UITableViewCell 时使用 alloc 和 init
Posted
技术标签:
【中文标题】使用 Storyboard 中的 UITableViewCell 时使用 alloc 和 init【英文标题】:Using alloc and init when using a UITableViewCell from Storyboard 【发布时间】:2013-02-13 23:33:12 【问题描述】:我正在使用 Storyboard 做一个简单的应用程序,它有一个带有 UITableView
和 UITableViewCell
的视图,可以导航到另一个 UIView
。
因此必须编写代码来填充表格视图上的单元格。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellIdentifier = @"SampleCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
NSLog(@"cai no init da cell");
GPItem *item = [self.items objectAtIndex:indexPath.row];
cell.textLabel.text = @"Post";
cell.detailTextLabel.text = item.imageURL;
return cell;
我意识到代码 if (cell == nil) ...
永远不会执行,所以我真的需要在使用 Storyboard 中的单元格时这样做吗?
谢谢。
【问题讨论】:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
这使得单元格不为零
【参考方案1】:
你是对的;如果您使用情节提要,则该代码保证返回非零单元格。此外,在 ios 6 中,新调用 dequeueReusableCellWithIdentifier:forIndexPath:
never 返回 nil。请参阅我书中的讨论:
http://www.apeth.com/iOSBook/ch21.html#_registering_a_cell_class
【讨论】:
谢谢伙计。那么,您对使用故事板有何看法?应该用还是不用? 我有时会使用故事板,但我也知道如何在代码中或使用旧式 nib 文件生成我的界面和视图控制器。只要您了解故事板,它们就很棒。它们不是魔法。你仍然需要知道真正发生了什么。再次,请参阅我的书:apeth.com/iOSBook/ch19.html#_storyboards【参考方案2】:如果您在表格视图的原型单元格中声明了您的 UITableViewCell,则它已经被分配并且只需要出列。如果您使用的是自定义 UITableViewCell 子类,则必须检查它是否为 nil 并在必要时分配新实体。
【讨论】:
这并不完全正确。自定义 UITableViewCell 子类仍然可以是情节提要中的原型单元格,因此它永远不会为零。 我不记得说过自定义单元格不能被原型化。我说如果单元没有原型,它应该被分配。上下文人,上下文。【参考方案3】:不,在使用情节提要中制作的单元格时,您不需要该代码。
如果您在界面构建器中提供给单元格的identifier
和您在代码中使用的标识符发生漂移,最好删除此代码,以便您尽早崩溃。这个 sn-p 将掩盖这个错误,并只提供一个您很可能不打算拥有的单元格。
【讨论】:
以上是关于使用 Storyboard 中的 UITableViewCell 时使用 alloc 和 init的主要内容,如果未能解决你的问题,请参考以下文章
使用 Storyboard 中的 UITableViewCell 时使用 alloc 和 init
在 Storyboard 的 UIImageView 中使用 Images.xcassets 中的启动图像?
使用 Delegate 在 ContainerView 中的 Storyboard 中创建 UITableView
xamarin.ios 中的 UITabBarController 不使用 StoryBoard