UITableView 及其在 xib 文件中的单元格
UITableView and its cell in a xib file
长话短说,我想创建一个 XIB 文件,其中包含:
一景。在那个视图中,它有很多东西和一个 tableView。 (连接的数据源,委托给文件的所有者)。该视图是 XIB 文件的主视图。
自定义单元格,(用作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 应该只包含一个视图。所以你必须为 UITableViewCell
和 UITableView
做一个不同的。背后的原因很简单。每次加载 xib 时,都会创建 xib 内的所有视图。每次创建单元格时,您都不需要一个新的 table。对吗?
至于你面临的崩溃。错误看起来是名称 tableView
存在插座问题。尝试删除插座并重新初始化它们
添加
对于 UICollectionView
你可以注册一个 class,它会从 xib 加载你的视图。
[self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier]
更新
如果您使用的是故事板,则只需添加两个原型单元格,这将在 table 视图中添加两个单元格。您可以在那里添加所有视图,并为它们提供不同的 class 文件。将减少您需要维护的 xib 文件的数量,并且您不需要注册您的 nib。这可能是 tutorial
长话短说,我想创建一个 XIB 文件,其中包含:
一景。在那个视图中,它有很多东西和一个 tableView。 (连接的数据源,委托给文件的所有者)。该视图是 XIB 文件的主视图。
自定义单元格,(用作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 应该只包含一个视图。所以你必须为 UITableViewCell
和 UITableView
做一个不同的。背后的原因很简单。每次加载 xib 时,都会创建 xib 内的所有视图。每次创建单元格时,您都不需要一个新的 table。对吗?
至于你面临的崩溃。错误看起来是名称 tableView
存在插座问题。尝试删除插座并重新初始化它们
添加
对于 UICollectionView
你可以注册一个 class,它会从 xib 加载你的视图。
[self.collectinView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellIdentifier]
更新
如果您使用的是故事板,则只需添加两个原型单元格,这将在 table 视图中添加两个单元格。您可以在那里添加所有视图,并为它们提供不同的 class 文件。将减少您需要维护的 xib 文件的数量,并且您不需要注册您的 nib。这可能是 tutorial