自定义UITableViewCell:SIGABRT on“loadNibNamed:”

时间:2011-08-01 11:55:28

标签: ios uitableview

我正试图通过自定义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];

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

3 个答案:

答案 0 :(得分:4)

除了来自@Seega的关于你的笔尖名称的评论,这似乎是合理的,你在nib加载代码中有很多问题;

+ (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个实例为零,因此发送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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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