使用UITableView的registerNib:方法从nib文件中加载自定义UITableViewCell时如何分配文件所有者?

9

我一直在研究如何使用UITableViewregisterNib:[dequeueReusableCellWithIdentifier:forIndexPath:]来加载来自NIB的自定义UITableCellView。这是我从控制器中摘取的关键部分:

- (void)viewDidLoad

[super viewDidLoad];
self.tableView.bounces = NO;
[self.tableView registerNib:[UINib nibWithNibName:@"ProgramListViewCell" bundle:nil] forCellReuseIdentifier:@"Cell"];



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

TVProgramListTableViewCell *cell = (TVProgramListTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

cell.frame = CGRectMake(0, 0, CELLWIDTH, OPENCELLHEIGHT);
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.clipsToBounds = YES;

cell.titleLabel.text = [NSString stringWithFormat:@"herpa derp: %i", indexPath.row];

return cell;

所以我在视图加载时注册了NIB,然后利用它进行单元格出列。到目前为止,一切都像我期望的那样工作。我的自定义TVProgramListTableViewCellNIB中正确加载,并且其IBOutlet已连接。 NIB包含一个按钮的视图,我希望它能触发控制器的事件。我可以将文件所有者类型设置为我的表视图控制器类,但我不知道如何实际连接文件所有者。
现在,如果我使用loadNibNamed:并自己加载NIB,连接文件所有者将很容易。在使用registerNib的情况下,是否有任何方法可以实现这一点?除了无法连接文件所有者之外,这似乎是在UITableView中使用自定义单元格的完美方式。
1个回答

2
据我所知,没有办法将文件的所有者设置为您的表视图控制器并在xib文件中连接动作方法--我尝试过,但会导致应用程序崩溃。通常的做法是在cellForRowAtIndexPath方法中调用addTarget:action:forControlEvents:来为您的按钮添加目标,并将自身作为目标传递。

1
是的,当单元格被出列时,我又开始使用loadNibNamed:了。这使我能够将所有者设置为我的控制器,并获取自定义单元格中的IBOutlets。因此,无需调用addTarget,我可以在IB中将按钮事件绑定到文件所有者,并将其路由到我的控制器,同时仍将我的UIView映射到自定义UITableViewCell中的outlets。 - Ville Rinne
@VilleRinne,我认为注册nib比为每个创建的单元格加载nib更有效(这也是Apple引入它的原因)。 - rdelmar
是的,它可能更有效率,但如果你无法将控制器绑定到nib的File's Owner上,那么它就没有什么用处了。效率真的是一个问题吗?毕竟,只有在无法出列单元格时才会加载nib。 - Ville Rinne
@VilleRinne,为什么它不是很有用呢?添加按钮目标操作的代码行与插入加载nib的代码行一样容易。 - rdelmar
1
在cellForRowAtIndexPath中,如何避免将动作添加到同一单元格超过一次,考虑到当有nib注册时,dequeueReusableCellWithIdentifier从不返回nil?@rdelmar - Nate Cook
1
@NateCook,如果我在代码中添加视图,通常会通过将所有子视图的创建和添加操作放在if块中来实现,该块检查是否存在具有特定标记的视图。给一个UI元素一个唯一的标记,然后将所有内容放在if ([cell.contentView viewWithTag:101] == nil)中,这样已经配置过的任何单元格都不会再次添加东西。但通常我根本不这样做。我在故事板中制作单元格,并将按钮的操作连接到控制器。 - rdelmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接