nib 项目中的 CellForRowAtIndexPath

Posted

技术标签:

【中文标题】nib 项目中的 CellForRowAtIndexPath【英文标题】:CellForRowAtIndexPath in a nib project 【发布时间】:2014-12-17 21:00:07 【问题描述】:

我已经在我的项目中实现了 CellForRowAtIndexPath 方法。

看起来像这样:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 


    static NSString *cellIdentifier = @"StackTableViewCell";

    Target *target = [self.fetchedResultController objectAtIndexPath:indexPath];

    StackTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"StackTableViewCell" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    

    cell.cellLabel.text = target.body;

    cell.cellLabel.font = [UIFont fontWithName:@"Candara-Bold" size:20];[UIFont fontWithName:@"Candara-Bold" size:20];

    // Configure the cell...

    return cell;

但是有一些事情让我很困扰,那就是我真的不明白这部分发生了什么(我从一些教程中得到了它):

if (!cell)
        
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"StackTableViewCell" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
        

有人可以帮我理解吗?

谢谢!

【问题讨论】:

您是否阅读过《ios 表格视图编程指南》的相关部分? 我应该读什么部分? 试试developer.apple.com/library/ios/documentation/UserExperience/…和developer.apple.com/library/ios/documentation/UserExperience/… 另请阅读UITableView dequeueReusableCellWithIdentifier: 的文档。 【参考方案1】:

如果表格视图没有可重复使用的单元格,请加载存在于 StackTableViewCell.xib 中的对象。假设您找到的在顶层定义的第一个可以实例化为您想要的单元格类型。

【讨论】:

【参考方案2】:
if (!cell)
        
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"StackTableViewCell" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
        

当单元格为 nil 时,您正在尝试从 nib 加载单元格。

通常,我喜欢这样:

在 ViewDidLoad 中

[self.tableView registerNib:[UINib nibWithNibName:@"StackTableViewCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];

所以在 tableView:cellForRowAtIndexPath 方法中你可以获得单元格,你不需要检查它是否为 nil,因为它总是返回单元格

StackTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

【讨论】:

以上是关于nib 项目中的 CellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

nib loader 只保留 nib 中的第一个*** UIView?

iPhone:使用 *.m 和 *.h 文件从 1 个项目复制到另一个项目时,Nib 文件无法正常工作

Swift 中的 NSWindowController。使用 Nib 进行子类化和初始化

如何将 iOS 项目更改为根本不使用 nib 而只使用 Objective-C 代码?

是否可以从加载到的视图中访问/操作 nib 文件中的约束?

从包中加载 NIB 时出现异常