我有一个UITableView
,其中一个UITableView
嵌套在其单元格内(我知道这是不好的做法,不用担心!)。
问题在于,当我打电话给dequeueReusableCellWithIdentifier:
时,我回来了。但是,当UITableView
没有嵌套在另一个内部时,这种方法就可以正常工作。
有没有办法不重用UITableViewCell
,而是每次都直接实例化?
我尝试过使用它:
ContactFieldCell *cell = [[ContactFieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:thisCellIdentifier];
不会返回nil,但我的UITableView
中没有任何内容!
以下是“父”UITableView的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ContactCardCell";
ContactCardCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSArray *objects = [[sections objectAtIndex:indexPath.section] objectForKey:@"objects"];
CDCard *card = [objects objectAtIndex:indexPath.row];
cell.delegate = self;
cell.fieldsTableView = [[CardTableViewController alloc] initWithCard:card];
[cell.fieldsTableView.view setFrame:CGRectMake(17, 12, 256, 163)];
[cell.contentView addSubview:cell.fieldsTableView.view];
return cell;
}
这里是“child”UITableView的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *thisCellIdentifier = @"ContactFieldCell";
ContactFieldCell *cell = [self.tableView dequeueReusableCellWithIdentifier:thisCellIdentifier];
cell.delegate = self;
cell.field = [self.card.sortedFields objectAtIndex:indexPath.row];
return cell;
}
ContactFieldCell是故事板中的原型单元格。它具有以下代码:
@interface ContactFieldCell : UITableViewCell
@property (nonatomic, weak) id<ContactFieldCellDelegate> delegate;
@property (nonatomic, strong) CDField *field;
@property (nonatomic, strong) IBOutlet UILabel *displayNameLabel;
@end
答案 0 :(得分:2)
dequeueReusableCellWithIdentifier:
不会创建单元格。
手动创建单元格,或使用dequeueReusableCellWithIdentifier:forIndexPath:
答案 1 :(得分:1)
是的 - @vikingosegundo是正确的,但为了扩展他的答案,你还需要先注册你的手机。 dequeueReusableCellWithIdentifier:
可能会返回零。如果你需要创建你的单元格,但是dequeueReusableCellWithIdentifier: forIndexPath:
总会返回一个有效的单元格,那么你需要告诉它什么类型的单元格,这就是registerClass
所做的。
为两个UITableViews执行此操作。
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView registerClass:[ContactFieldCell class] forCellReuseIdentifier:@"ContactFieldCell"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *thisCellIdentifier = @"ContactFieldCell";
ContactFieldCell *cell = [self.tableView dequeueReusableCellWithIdentifier:thisCellIdentifier forIndexPath:indexPath];
cell.delegate = self;
cell.field = [self.card.sortedFields objectAtIndex:indexPath.row];
return cell;
}
答案 2 :(得分:0)
UITableView
是一个非常强大的元素,可用于构建优秀的应用程序。
唯一要记住的是,必须清楚基础知识。现在,从您的代码中,我无法确定您是否已正确分配delegate
和dataSource
,但我仍会提及它以防其他人需要它。
您有一个子类UITableViewCell
,其中包含UITableView
。外部UIViewController
的{{1}}必须是delegate
和dataSource
。确保您已在UITableView
和.h
文件中设置了它。
接下来,您的自定义单元格也必须是.m
和delegate
,但内部dataSource
。我想在这里,您已经在UITablewView
的{{1}}方法中创建了内部UITableView
。在那里设置init
和UITableViewCell
。然后在delegate
方法中设置其他运行时属性(如果需要)并将其称为dataSource
。
drawRect
必须覆盖外部表的委托和dataSource方法,并且单元格必须覆盖内部表的方法。
另外,请确保绘制单元格的时间,数据不是reloadData
或UIViewController
。
一个非常重要的事实,人们错过了以下代码:
nil
只是将单元格出列是不够的。单元格第一次出列时,它是null
,因为它尚未创建。因此static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
条件。分配并初始化并添加到表中后,出列代码将起作用。
注意:仔细查看您的代码后(抱歉没有第一次查看),我发现您已为您的单元格分配了nil
。您认为该单元格将如何显示控制器?请改用if
。尝试遵循我在第3段中提到的模式。使用自定义单元格中的表作为私有成员(或属性,您的愿望),在UITableViewController
中分配它。从视图控制器将数据分配给单元格。然后使用此数据在其UITableView
中设置内部表格视图单元格的属性。它应该工作正常。