在我的应用中,我使用的是故事板。但是我以编程方式创建了UITableView
,而不是从对象库中拖动。现在我想自定义以编程方式创建的UITableView
的单元格。任何人都可以通过提供在故事板中以编程方式创建UITableViewCell
的示例来帮助我吗?
答案 0 :(得分:8)
我会避免将您的单元格的布局和构建放入cellForRowAtIndexPath
。
要以编程方式创建自定义单元格,首先应创建一个UITableViewCell
子类。
添加labels
,imageViews
等...添加cell.contentView
的as子视图。
<强>编程强>
即
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
_label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 21)];
[self.contentView addSubview:_label];
}
return self;
}
如果你想做单元格的布局,那么你可以在MyCell
课程中做...
- (void)layoutSubViews
{
[super layoutSubviews];
// layout stuff relative to the size of the cell.
}
然后在tableViewController
中你需要注册单元格类......
在viewDidLoad
...
[self.tableView registerClass:[MyCell class] forCellReuseIdentifier:@"MyCellIdentifier"];
WITH INTERFACE BUILDER
仍然创建自定义子类,但也创建一个同名的xib文件。然后在你的xib文件中你可以连接出口而不必在单元的init中创建它们。 (如果你这样做,那么无论如何都不会调用init。)
您需要的唯一其他更改是在viewDidLoad
中您需要为单元格而不是类注册nib。
喜欢这个......
UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"MyCellIdentifier"];
然后其他一切都是一样的。
使用电池
使用您为...创建子类的单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];
[self configureCustomCell:(MyCell*)cell atIndexPath:indexPath];
return cell;
}
- (void)configureCustomCell:(MyCell*)cell atIndexPath:(NSIndexPath *)indexPath
{
// do all you logic of getting any info from arrays etc in here.
cell.label.text = @"Blah".
}
<强>概要强>
这样做意味着你的tableviewcontroller只对将东西放入单元格感兴趣。如果你把所有的逻辑用于构建你的单元格,那么一切都会变得非常混乱。
这也意味着您不必处理大量不同的标签来保存和检索不同的UI元素。
答案 1 :(得分:0)
我将描述两个选项:使用Interface Builder添加单元格(更简单),并以编程方式添加单元格:
使用Interface Builder
在Interface Builder中创建单元格并添加包含自定义内容的子视图后,打开“属性”检查器,选择自定义样式,并在重用标识符中输入唯一标识符文本字段(例如,“anIdentifier”)。接下来,选择要以编程方式访问的单元格字段,并为每个单元格字段设置唯一的标记编号(位于视图部分下)。
然后,在您的数据源代码中,实现此方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier"];
UILabel *label;
label = (UILabel *)[cell viewWithTag:1]; // Set a constant for this so your fellow developers understand this number
label.text = @"This is a test";
return cell;
}
<强>编程强>
如果要以编程方式创建单元格,则代码应与此类似:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"anIdentifier";
UILabel *aLabel;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]];
aLabel = [[[UILabel alloc] initWithFrame:...]];
aLabel.tag = 1; // Set a constant for this
aLabel.font = [UIFont systemFontOfSize:14.0];
aLabel.textAlignment = UITextAlignmentRight;
aLabel.textColor = [UIColor blackColor];
aLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
[cell.contentView addSubview:mainLabel];
} else {
aLabel = (UILabel *)[cell.contentView viewWithTag:1];
}
aLabel.text = @"This is a test";
return cell;
}
Apple的网站上有更多信息:http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html