如何在 ios 中使用 UI NIB 而不是 loadNibNamed 来自定义 UI 表格视图单元格?

Posted

技术标签:

【中文标题】如何在 ios 中使用 UI NIB 而不是 loadNibNamed 来自定义 UI 表格视图单元格?【英文标题】:how to use UI NIB instead of loadNibNamed for custom UI tableview cell in ios? 【发布时间】:2014-09-20 07:49:42 【问题描述】:

我正在制作一个自定义 ui 表格视图单元格。我知道我可以使用loadNibNamed 方法来使用.xib 的单元格,但是当我的数据太多时,这会导致滚动变慢。

我想使用 UI nib,因为它比 loadNibNamed 加载自定义单元格 .xib 文件的方法快得多。

static NSString *cellIdentifier = @"PostStreamCell";

PostStreamCell *cell= [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil)

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"PostStreamCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];    
    UINib *cellNib = [UINib nibWithNibName:@"MemberCell" bundle:nil];  
    [cell.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"MemberCell"];


cell.textlabel.text =@"xyzabc123";

我尝试在上面的“if”块中使用下面的代码,但未能使用它。任何帮助将不胜感激。

UINib *cellNib = [UINib nibWithNibName:@"PostStreamCell" bundle:nil];      
[cell registerNib:cellNib forCellWithReuseIdentifier:@"PostStreamCell"];

【问题讨论】:

【参考方案1】:
    使用 UITableViewCell 作为***对象创建您的 xib 文件。这称为 Cell.xib 根据该文件创建一个 UINib 对象 向表视图注册 UINib(通常在表视图控制器子类的 viewDidLoad 中)。

在 viewDidLoad 中使用以下行:

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

然后,在 cellForRowAtIndexPath 中,如果您想要 nib 中的一个单元格,则将其出列:

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

这要么从 nib 创建一个新实例,要么使现有单元出队。

【讨论】:

那么我应该删除 if(cell == nil ) check in cellforrowatindexpath 方法吗?【参考方案2】:

你只需要注册一次 Xib,所以这个 regiserNib 代码应该放在你的类文件的 viewDidLoad 方法中

 UINib *cellNib = [UINib nibWithNibName:@"PostStreamCell" bundle:nil];

 [self.tablview registerNib:cellNib forCellWithReuseIdentifier:@"PostStreamCell"];

然后在 tableview 的 cellForRowAtIndexPath 方法中

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

    static NSString *cellIdentifier = @"PostStreamCell";

    PostStreamCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    cell.textlabel.text =@"xyzabc123";

这将在您需要时为您工作。

干杯

编辑以响应 PostStreamCell 错误*

请确保您的自定义 UITableViewCell xib 具有“PostStreamCell”标识符,您可以在 IB 的这一部分中设置该标识符

请注意 xib 是一个 UITableViewCell 对象。

更新 - 显示在哪里检查与 xib 关联的自定义类文件的图片

在 IB 的 Utilities 中,请确保您的自定义 UITableViewCell 使用您的自定义类文件 PostStreamCell。请检查它们是否显示在 IB 的这一部分中。

在你的 UIViewController 类文件中,(你有 UITableView 方法等)确保

#import "PostStreamCell.h"

【讨论】:

那么我应该删除 if(cell == nil ) check in cellforrowatindexpath 方法吗? @warzone_fz 没有它也能正常工作。 if(cell==nil) 可用于处理没有可重复使用的单元格出列的情况,因此您可以在其中创建一个单元格,尽管如前所述,如果它不存在也可以正常工作。 在这一行 PostStreamCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; PostStreamCell自定义tablviewCell类文件你导入了吗? 这个异常即将到来:笔尖(Horizo​​ntalCell)中的单元重用标识符与用于注册笔尖(PostStreamCell)的标识符不匹配

以上是关于如何在 ios 中使用 UI NIB 而不是 loadNibNamed 来自定义 UI 表格视图单元格?的主要内容,如果未能解决你的问题,请参考以下文章

在 nib 文件中使用安全区域布局,但将部署目标保留为 iOS 8

如何使用 Quickblox 在 Chat ViewController 中自定义或使用我自己的 nib 作为工具栏?

在 Nib 而不是 Storyboard 中创建 UITabBarController

如何防止键盘覆盖我的 UI 而不是调整它的大小?

如何在 nib 文件中的 ios 中添加幻灯片导航

iOS:使用 nib 子类化 UITableViewCell,进入 UIView(不是视图控制器)子类