我想使用XIB创建自定义UITableViewCell,但我不知道如何使用UITableViewController的排队机制来回收它。我怎么能做到这一点?
伙计们,这个问题的目的是按照the FAQ进行自我回答,尽管我喜欢这种令人敬畏的回答。有一些赞成,给自己喝啤酒。我问这个是因为有朋友问我,我想把它放在StackOverflow上。如果你有任何贡献,无论如何!
答案 0 :(得分:51)
如果您使用的是iOS 5,则可以使用
[self.tableView registerNib:[UINib nibWithNibName:@"nibname"
bundle:nil]
forCellReuseIdentifier:@"cellIdentifier"];
然后每当你打电话:
cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
tableview将加载nib并为你提供一个单元格,或者为你出一个单元格!
nib只需要一个在其中定义的单个tableviewcell的笔尖!
答案 1 :(得分:2)
创建一个空的笔尖并将表格单元格添加为第一个项目。在检查器中,您可以在Interface Builder中添加reuseIdentifier字符串。
要在代码中使用单元格,请执行以下操作:
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (cell == nil)
{
cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0];
}
//set up cell
return cell;
}
还有另一种方法可以为您的单元格创建一个插座,并使用控制器作为文件的所有者加载单元格笔尖,但老实说这更容易。
如果您希望能够访问已添加到笔尖中的单元格的子视图,请为其添加唯一标记,并使用[cell viewWithTag:x];
访问它们如果您希望能够在单元格上设置自定义属性,则需要创建自定义UITableViewCell子类,然后在InterfaceBuilder中将其设置为nib的类,并在您使用时将UITableViewCell转换为自定义子类在上面的代码中将其出列。
答案 2 :(得分:2)
要使用XIB设置自定义UITableViewCell,您必须执行以下操作:
tableView:cellForRowAtIndexPath:
所以......让我们在头文件中设置一个IBOutlet。
@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell;
不要忘记在实现文件中合成它。
@synthesize dvarTorahCell;
现在,让我们创建并配置单元格。您需要注意Cell Identifier和IBOutlet,如下所示:
现在在代码中,您将XIB加载到您的单元格中,如下所示:
请注意,Interface Builder中的Cell Identifier与下面代码中显示的一致。
然后你继续像其他任何一样配置你的细胞。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil];
cell = dvarTorahCell;
dvarTorahCell = nil;
}
//configure your cell here.
请注意,在访问子视图(例如标签)时,您现在需要按标记引用它们,而不是通过textLabel
和detailTextLabel
等属性名称引用它们。
答案 3 :(得分:1)
在这里你可以这样做:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
if (!cell)
{
NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
cell = [topLevelItems objectAtIndex:0];
}
return cell;
}
.h中的cellLoader
定义如下:
UINib *cellLoader;
和.m的实现如下(例如在初始化期间):
cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain];
和CellClassName
是.m中定义的如下(也是你的xib的名称)。
static NSString *CellClassName = @"YourCustomeCell";
不要忘记在xib创建的单元格中使用字符串CellClassName
。
有关详细信息,我建议您阅读这篇精彩的教程creating-a-custom-uitableviewcell-in-ios-4。
希望它有所帮助。
P.S。我建议你使用UINib
,因为它是一种加载xib文件的优化方法。