嵌套的UITableView不返回任何单元格

时间:2014-01-26 15:21:10

标签: ios objective-c uitableview

我有一个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

3 个答案:

答案 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是一个非常强大的元素,可用于构建优秀的应用程序。

唯一要记住的是,必须清楚基础知识。现在,从您的代码中,我无法确定您是否已正确分配delegatedataSource,但我仍会提及它以防其他人需要它。

您有一个子类UITableViewCell,其中包含UITableView。外部UIViewController的{​​{1}}必须是delegatedataSource。确保您已在UITableView.h文件中设置了它。

接下来,您的自定义单元格也必须是.mdelegate,但内部dataSource。我想在这里,您已经在UITablewView的{​​{1}}方法中创建了内部UITableView。在那里设置initUITableViewCell。然后在delegate方法中设置其他运行时属性(如果需要)并将其称为dataSource

drawRect必须覆盖外部表的委托和dataSource方法,并且单元格必须覆盖内部表的方法。

另外,请确保绘制单元格的时间,数据不是reloadDataUIViewController

一个非常重要的事实,人们错过了以下代码:

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中设置内部表格视图单元格的属性。它应该工作正常。