自定义 UITableViewCell:“loadNibNamed:”上的 SIGABRT

Posted

技术标签:

【中文标题】自定义 UITableViewCell:“loadNibNamed:”上的 SIGABRT【英文标题】:Custom UITableViewCell: SIGABRT on "loadNibNamed:" 【发布时间】:2011-08-01 11:55:28 【问题描述】:

我正在尝试使用自定义 nib 文件来完成 UITableViewCell 的子类。

子类的名称是 MyCustomCell。 .xib 文件只有一个带有单个 UILabel“cellTitle”的 UITableViewCell,我已将它连接到 UITableViewCell 子类中的插座。

在返回单元格的 MyCustomCell 类中,我在以下行收到 SIGABRT 错误:

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:NULL];

下面是 cellForRowAtIndexPath 的实现:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


static NSString *kCustomCellID = @"MyCellID";

myCustomCell *cell = (myCustomCell *)[tableView dequeueReusableCellWithIdentifier:kCustomCellID];
if (cell == nil)

    cell = (myCustomCell *)[myCustomCell cellFromNibNamed:@"myCustomCell"];

//TODO: Configure Cell
return cell;

这是 myCustomCell cellFromNibNamed 的实现:

+ (myCustomCell *)cellFromNibNamed:(NSString *)nibName 

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:NULL];
NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
myCustomCell *customCell = nil;
NSObject* nibItem = nil;
while ((nibItem = [nibEnumerator nextObject]) != nil) 
    
    if ([nibItem isKindOfClass:[myCustomCell class]]) 
        
        customCell = (myCustomCell *)nibItem;
        break; // we have a winner
        
    
return customCell;

我在该行中收到 SIGABRT 错误

    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:NULL];

在上述方法中。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

除了@Seega 对您的笔尖名称的评论(这似乎是合理的)之外,您在笔尖加载代码中还有很多问题;

+ (myCustomCell *)cellFromNibNamed:(NSString *)nibName 

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"View" owner:self options:NULL];
NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
myCustomCell *customCell = nil;
NSObject* nibItem = nil;
while ((nibItem = [nibEnumerator nextObject]) != nil) 
    
    if ([nibItem isKindOfClass:[myCustomCell class]]) 
        
        customCell = (myCustomCell *)nibItem;
        break; // we have a winner
        
    
return customCell;

您的 customCell 实例为 nil,因此向其发送 class 方法是无操作并返回 nil。在这种情况下,isKindOfClass: 不会返回您的想法。

另外,不要遍历loadNibNamed:owner:options: 方法返回的对象列表。而是在文件所有者和 nib 文件中的单元格之间创建连接,以便在 nib 加载时设置它。然后将您的代码更改为如下所示;

+ (myCustomCell *)cellFromNibNamed:(NSString *)nibName 
  [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];
  myCustomCell *gak = self.theFreshlyLoadedCustomCellThingSetUpInIB;
  // clean up
  self.theFreshlyLoadedCustomCellThingSetUpInIB = nil;
  return gak;

此外,用小写字符命名类是不典型的。其他阅读您的代码的人会认为这是一个变量而不是一个类。改为MyCustomCell

【讨论】:

你能解释一下 self.theFreshlyLoadedCustomCellThingSetUpInIB 的意思吗?在我看到的示例中,人们要么遍历 nib 的内容,要么简单地使用 objectAtIndex:0,因为他们认为它应该在那里,因为那里不应该有其他东西。 当然,在上面的 self 类中设置一个出口(视图控制器?),它指向表格视图单元格。当您加载单元格时,NSBundle 代码会将那个出口设置为单元格。【参考方案2】:

我认为你应该使用字符串参数“nibName”而不是@“View”

NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];

【讨论】:

【参考方案3】:

正如人们指出的那样,我的代码中存在许多问题。导致我在标题中讨论的实际问题的问题原来是 IB 中的一个问题:我有引用文件所有者而不是实际对象的网点。

但我把这个交给比尔,因为他解决了最多的错误......

【讨论】:

以上是关于自定义 UITableViewCell:“loadNibNamed:”上的 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 的首选方式

自定义 UITableViewCell 按钮单击

自定义 UITableViewCell 中的自定义 UIView

自定义UITableViewCell

向自定义 UITableViewCell 输入数据

自定义 UITableViewCell 的 iOS 单元测试