我有一个包含两个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
结束时强制setNeedsDisplay
和viewWillAppear:
,但无济于事。
令我感到困惑的是,只要具有自定义单元格的表最初不可见,但在启动后切换到该表,这一切都有效。
答案 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中的逻辑:确定是否应该隐藏它而另一个是隐藏的(基于保存的状态)。
事实证明,当我在发布时隐藏它们并使用保存的状态取消隐藏其中一个时,一切正常。