我有一个自定义静态UITableViewCell
我希望看起来与右侧详细信息单元格完全相同(左侧是UILabel
,右侧是UILabel
),除了我想要的右UILabel
是可编辑的UITextField
。由于我想在故事板中的多个视图控制器中使用此单元格,我认为最好的选择是创建 MyEditableTableViewCell.xib 文件,以及相应的* .h,m 文件。我在 MyEditableTableViewCell.h 中有两个公共属性:
@property (weak, nonatomic) IBOutlet UILabel *textLabel;
@property (weak, nonatomic) IBOutlet UITextField *detailTextField;
这些IBOutlet
已连接到.xib文件中的UILabel
和UITextField
。在我的故事板中,我有一个自定义UITableViewController
子类,我将必要的UITableViewCell
的类更改为MyEditableTableViewCell
。我的视图控制器中有一个属性:
@property (weak, nonatomic) IBOutlet MyEditableTableViewCell *myCell;
然而,当我运行应用程序时,单元格显示为一个空白单元格。对它运行一些检查,我看到[myCell isKindOfClass:[MyEditableTableViewCell class]]
返回true。但是,UITextField
似乎永远不会被实例化。当我尝试改变myCell.detailTextField.text
时,没有任何反应,myCell.detailTextField
似乎是零。
任何帮助将不胜感激!
答案 0 :(得分:8)
您如何创建MyEditableTableViewCell
的实例?我的猜测是你正在做[[MyEditableTableViewCell alloc] init]
而不是从笔尖加载它们。
您的视图控制器中不需要该属性。您需要使用-[UITableView registerNib:forCellReuseIdentifier:]
在表格视图中注册单元格笔尖。在viewDidLoad
中执行此操作。然后,当您将dequeueReusableCellWithIdentifier:
发送到表视图时,它将实例化nib,创建一个MyEditableTableViewCell
,并将其返回给您。
如果您在故事板中布置静态单元格,则使用xib布置单元格有点困难。最简单的方法就是在故事板中布置单元格的子视图。如果您有一些相同的类型,可以将子视图复制并粘贴到每个单元格。
如果您真的想使用xib,最简单的方法是构建单元格的视图层次结构,如下所示:
MyEditableTableViewCell (in storyboard)
|
+- cell's content view (created automatically by UIKit)
|
+- UIView (top-level view of the xib)
|
+- UILabel (textLabel)
|
+- UITextField (detailTextField)
因此,您将故事板中的单元格类设置为MyEditableTableViewCell
。然后你创建你的xib。您将xib文件的所有者类设置为MyEditableTableViewCell
。 xib 不包含MyEditableTableViewCell
。 xib的顶级视图只是一个普通的UIView
,包含子视图(标签和文本字段)。
在-[MyEditableTableViewCell initWithCoder:]
中,在执行self = [super initWithCoder:aDecoder]
后,实例化xib,将self
(单元格)作为xib文件的所有者传递。单元格可以有出口连接到标签和xib中的文本字段。
在实例化xib后,将xib中的顶级视图添加为self.contentView
的子视图。如果您正在使用自动布局,请在顶级视图和内容视图之间创建约束。否则,请将顶级视图的frame
设置为内容视图的bounds
,并将自动调整模板设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
。
答案 1 :(得分:0)
虽然静态表视图不会从笔尖中获取您的单元格,但它仍然会调用cellForRowAtIndexPath
。在那里,您可以出列并返回完全未归档的自定义单元格。可以通过在cellForRowAtIndexPath
上调用super来获取在IB中设置的自定义单元格上的属性:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// get an empty cell with properties retained from IB
UITableViewCell *sup = [super tableView:tableView cellForRowAtIndexPath:indexPath];
if ([sup isKindOfClass:[MyCustomCell class]]) {
// fetch a fully unarchived cell
MyCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"foo" forIndexPath:indexPath];
// copy properties over...
[cell copyPropertiesFromCell:(MyCustomCell *)sup];
return cell;
}
return sup;
}
根据具体情况,这可能比弄脏IB对象更容易。