使用 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 做一个简单的应用程序,它有一个带有 UITableViewUITableViewCell 的视图,可以导航到另一个 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

在 UICollectionViewCell 中使用 Storyboard 中的自动布局约束

使用 Storyboard 覆盖 Swift 中的菜单