0

我正在尝试解决我确定是一个常见问题。

我有一个与故事板连接的 UITableViewController,并且正在使用两个原型单元。在导航控制器的第一个视图中,所有单元格都正确加载。当尝试将该 UITableViewController 的另一个实例推送到导航堆栈(尽管具有不同的数据)时,我的问题出现了。

因为重用标识的单元只与情节提要中的第一个视图相关联,而不一定与类本身相关,所以我失去了重用这些原型单元并nildequeueReusableCellWithIdentifier:.

我怎样才能在堆栈的后期保持原型单元的使用?我唯一的解决方案是将笔尖与其中的自定义单元格连接起来并用它填充表格视图吗?

我的显示逻辑如下。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id toDisplay = [[navPool getObjectsForParent:indexPath.section] objectAtIndex:indexPath.row];

    if ([toDisplay isKindOfClass:[Category class]]) {
        Category *currentCategory = toDisplay;
        static NSString *CellIdentifier = @"Category";
        CategoryCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        cell.textLabel.text = currentCategory.name;
        [cell setCategoryId:currentCategory.categoryId];
        return cell;
    } else {
        if ([toDisplay isKindOfClass:[ListTopic class]]) {
            ListTopic *currentTopic = toDisplay;
            static NSString *CellIdentifier = @"Topic";
            ListTopicCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
            cell.textLabel.text = currentTopic.name;
            return cell;
        }
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    if ([cell isKindOfClass:[CategoryCell class]]) {            
        CategoryCell *cell = (CategoryCell *)[self.tableView cellForRowAtIndexPath:indexPath];
        BrowseViewController *newView = [[BrowseViewController alloc] initWithStyle:UITableViewStylePlain andParent:[cell.categoryId intValue]];
        [self.navigationController pushViewController:newView animated:YES];
    } else if ([cell isKindOfClass:[ListTopicCell class]]) {
        // push detail view
    }
}
4

1 回答 1

0

我最终完全按照我提到的去做,并在外部创建了 nib 并在dequeueReusableCellWithIdentifier:调用未返回对象时加载它们。我很惊讶这个问题并不常见,我的新代码如下。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id toDisplay = [[navPool getObjectsForParent:self.parent] objectAtIndex:indexPath.row];

    if ([toDisplay isKindOfClass:[Category class]]) {

        Category *currentCategory = toDisplay;

        static NSString *CellIdentifier = @"Category";

        CategoryCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!cell) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CategoryCellView" owner:self options:nil];
            cell = (CategoryCell *)[nib objectAtIndex:0];
        }

        cell.categoryName.text = currentCategory.name;
        [cell setCategoryId:currentCategory.categoryId];

        return cell;
    } else {
        if ([toDisplay isKindOfClass:[ListTopic class]]) {

            ListTopic *currentTopic = toDisplay;

            static NSString *CellIdentifier = @"Topic";

            ListTopicCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

            if (!cell) {
                NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TopicCellView" owner:self options:nil];
                cell = (ListTopicCell *)[nib objectAtIndex:0];
            }

            cell.textLabel.text = currentTopic.name;

            return cell;
        }
    }

    NSLog(@"Whatchu tryna pass hommie?");
    return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Default"];
}
于 2013-06-14T18:28:47.263 回答