自定义 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的主要内容,如果未能解决你的问题,请参考以下文章