2011-08-01 11 views
1

私は、カスタムnibファイルでUITableViewCellのサブクラスをやっています。カスタムUITableViewCell:SIGABRT on "loadNibNamed:"

サブクラスの名前はMyCustomCellです。 .xibファイルにはただ1つの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]; 

上記の方法では、私はここで間違って何をしていますか?

答えて

4

別に合理的なようだ@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インスタンスはそうclass方法は何もしませんし、nilを返し、それを送信する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としてください。

+0

あなたがself.theFreshlyLoadedCustomCellThingSetUpInIBによって何を意味するかに対処することはできますか?私が見た例では、人々はペン先の内容を反復するか、単にobjectAtIndex:0を使用します。なぜなら、そこに何も置かれていないはずの場所を想定しているからです。 – Ascendant

+0

もちろん、テーブルビューのセルを指している自己のクラス(ビューコントローラ?)にコンセントを設定してください。セルをロードすると、NSBundleコードはそのコンセントをセルに設定します。 –

1
私はあなたの代わりに、@の文字列パラメータ「nibName」を使用すべきだと思う

「ビュー」

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

私のコードには、多くの問題が指摘されています。私がタイトルで話していた実際の問題を引き起こしていた問題は、IBの問題であることが判明しました。私はアウトレットが実際のオブジェクトではなくファイルの所有者を参照していました。

しかし、彼はミスの最大数を扱っているため、私はビルに、このいずれかを与えている...

関連する問題