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

Edd*_*die 7 objective-c uitableview xib ios uicollectionview

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

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

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

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

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

编辑1

这是我如何将nib注册到storyboard中的主视图:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

- (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;
}
Run Code Online (Sandbox Code Playgroud)

如果在视图中执行了load方法,我将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.
}
Run Code Online (Sandbox Code Playgroud)

崩溃消息:

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

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

模型

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

Gan*_*ani 5

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

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:@"MyCell"]
Run Code Online (Sandbox Code Playgroud)

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

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

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

补充内容

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

 [self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier]
Run Code Online (Sandbox Code Playgroud)

更新

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