UITableView 及其在 xib 文件中的单元格

UITableView and its cell in a xib file

长话短说,我想创建一个 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.
}

崩溃信息:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key tableView.'

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

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

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

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

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

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

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

添加

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

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

更新

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