从笔尖加载自定义单元格无法按时完成

时间:2013-07-11 08:44:07

标签: ios iphone uitableview cocoa-touch uikit

我有一个包含两个UITableView的UIView,它们使用UIView导航栏中的分段控件进行切换。

第一个表(成分)仅使用标准单元格,并且工作正常。

第二个表(食谱)使用从笔尖加载的自定义单元格。问题在于,当应用程序启动并且配方表最后一次可见时(来自状态保存),当视图出现时,使用标准单元格呈现单元格。如果用户循环提到的分段控件,它们在返回到配方表时会按预期显示。

viewcontroller中tableView:cellForRowAtIndexPath:的相关部分:

// Check that we are displaying the right table
if (tableView == self.recipesTable) {
    static NSString *recipeCellIdentifier = @"RecipeCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:recipeCellIdentifier];

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"RecipeCell" owner:self options:nil];
    if(nib.count > 0)
        {
        cell = self.customCell;
        }
        else
        {
            NSLog(@"Failed to load CustomCell nib file!");
        }
    }

    // Set a number of properties of the custom cell
    // ...

    return cell;

self.customCell是一个IBOutlet UITableViewCell,它使用File的所有者绑定到实际nib文件中的单元格(nib只包含UITableViewCell)。

对我而言,这表明笔尖没有及时加载,即直到视图首次出现之后才会加载。

我已尝试将笔尖加载移至viewDidLoad方法,并在reloadData结束时强制setNeedsDisplayviewWillAppear:,但无济于事。

令我感到困惑的是,只要具有自定义单元格的表最初不可见,但在启动后切换到该表,这一切都有效。

2 个答案:

答案 0 :(得分:0)

您是否将UITableViewCell与您的nib文件一起子类化?

因为您可以尝试使用:(使用RecipeCell作为子类的名称)

RecipeCell *cell = (RecipeCell *)[tableView dequeueReusableCellWithIdentifier:recipeCellIdentifier];

if ( !cell ) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"RecipeCell" owner:self options:nil];

    if(nib.count > 0)
    {
        self.customCell = [nib lastObject]; //Assuming you only have one top level object 
                                    //in the nib
        cell = self.customCell;
    }
    else
    {
        NSLog(@"Failed to load CustomCell nib file!");
    }
}

为什么要将“customCell”实际用作属性?您可以像这样分配它并摆脱self.customCell

cell = [nib lastObject];

答案 1 :(得分:0)

问题不在于nib加载,而是在故事板中撒谎。在UIView中,设置是在任何给定时间只能看到两个表视图中的一个。在启动时,默认情况下使用标准单元格的表是可见的,但是viewWillAppear中的逻辑:确定是否应该隐藏它而另一个是隐藏的(基于保存的状态)。

事实证明,当我在发布时隐藏它们并使用保存的状态取消隐藏其中一个时,一切正常。