【问题标题】:UITableView and its cell in a xib fileUITableView 及其在 xib 文件中的单元格
【发布时间】:2015-10-11 23:40:37
【问题描述】:

长话短说,我想创建一个 XIB 文件,其中包含:

  1. 一个视图。在那个视图中,它有很多东西和一个 tableView。 (连接的数据源,委托给文件的所有者)。该视图是 XIB 文件的主视图。

  2. 自定义单元格,(用作tableView的原型单元格,因为XIB不支持原型tableView)。

我怎样才能实现这两个目标? 另外,我想知道同样适用于 UICollectionView。

我已经创建了这两个,将其加载到主视图(主视图在主故事板中)。但是 tableView 没有按预期加载自定义单元格。单元格是空白的,看起来不像笔尖设计的那样。

编辑 1

以下是我将笔尖注册到故事板主视图的方法:

- (UIView *)buildViewFromViewControllerClass:(Class)viewControllerClass
{
    id viewController = [[viewControllerClass alloc] initWithNibName:NSStringFromClass(viewControllerClass) bundle:nil];
    [viewController view].frame = self.containerView.bounds;

    [self addChildViewController:viewController];

    return [viewController view];
}

我有很多viewController,所以我发现这是添加VC的最佳方式。

关于上面描述的笔尖,我只是使用常规初始化:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // init cell
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    if (!cell) {
        cell = [[PaymentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];
    }

    return cell;
}

如果在视图中确实加载方法,我将 nib 注册到 tableView,它会在[tableView dequeueResuableCell...] 中崩溃。注册码:

- (void)viewDidLoad
{
    [super viewDidLoad];

//    [self.tableView registerNib:[UINib nibWithNibName:self.nibName bundle:nil]
//                forCellReuseIdentifier:@"CustomCell"];
// I'm commenting it, because it caused crash.
}

崩溃消息:

*** 由于未捕获的异常而终止应用程序 'NSUnknownKeyException',原因:'[ setValue:forUndefinedKey:]:这个类不是键值 键 tableView 的编码兼容。'

我在这里做错了什么? 这是我如何设计笔尖的图片:

如您所见,文件所有者的 mainView 连接到 mainView,其中包含 tableView。 customCell 只是一个自定义设计的单元格,在同一个文件(.m 文件)中定义。

【问题讨论】:

  • 您能否添加代码以说明如何添加单元格和注册您的笔尖
  • 这里是一个如何注册笔尖的例子[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:@"MyCell"];
  • 请看编辑1
  • @GaneshSomani 您应该将此作为答案发布(您将获得我的投票)。
  • @Eddie 根据苹果指南,您的 xib 中应该只有 1 个根视图

标签: ios objective-c uitableview uicollectionview xib


【解决方案1】:

您应该按如下方式注册笔尖。

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

我通常看到 registerClass 不会加载视图,而只会加载类。我不知道为什么。

一个 .xib 也应该只包含一个视图。所以你必须为UITableViewCellUITableView做一个不同的。背后的原因很简单。每次加载 xib 时,都会创建 xib 内的所有视图。每次创建单元格时,您都不需要一个新表格。对吧?

至于你面临的崩溃。该错误看起来像是名称为tableView 的插座问题。尝试移除插座并重新初始化它们

添加

对于UICollectionView,您可以注册一个类,它会从 xib 加载您的视图。

 [self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier]

更新

如果您使用的是故事板,您只需添加两个原型单元格,这将在表格视图中添加两个单元格。您可以在此处添加所有视图并为它们提供不同的类文件。将减少您需要维护的 xib 文件的数量,并且您不需要注册您的 nib。这可能是一个tutorial

【讨论】:

  • 我很失望地说:如果我将视图分成不同的 XIB 文件,它实际上可以工作。这不是我一开始想要的。看看有没有更好的答案。另外,请确认此方法是否也适用于 collectionView?
  • 关于一个更好的答案我不知道......但我觉得这是最正确的一个......你不能在 xib 中有两个视图,它只是从记忆中效率不高使用观点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多