xib ファイルを使用して UITableViewCell のコンテンツをレイアウトする適切な方法について知りたいです。インターネットで見つけたすべての手順に従おうとすると、いつも
キャッチされない例外 'NSUnknownKeyException' が原因でアプリを終了しています。
だからここに関連するコードがあります
@interface MyCell : UITableViewCell
@property (nonatomic,strong) IBOutlet UILabel* messageLabel;
@property (nonatomic,strong) IBOutlet UILabel* statusLabel;
そして、私の UIViewController で両方を試しました
-(void)viewDidLoad {
[self.tableView registerNib:[UINib nibWithNibName:@"MyCell"
bundle:[NSBundle mainBundle]]
forCellReuseIdentifier:@"CustomCellReuseID"];
}
または使用して
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"CustomCellReuseID";
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if ( !cell ) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil]
lastObject];
// or sometimes owner is nil e.g.
//cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil]
lastObject];
}
// ... remainder of cell setup
return cell;
}
タイトルで述べた例外を除いて、これらのアプローチはどちらも失敗します。owner:self の場合、UIViewController に IBOutlet プロパティがないため、エラーが発生しているようです。owner:nil を使用すると、内部で NSObject が使用されますが、これにはもちろん IBOutlet プロパティもありません。
私が見つけた唯一の回避策は次のとおりです。セルの init メソッド内で、返されたビュー/セルを初期化セルに追加します
例えば
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// nil out properties
[self.contentView addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil] lastObject]];
}
return self;
}
これは本当にばかげているように思えます (ただし、xib のベース タイプを MyCell または UITableViewCell ではなく UIView に変更することもできます)。
人々がこの特定のエラーに遭遇する投稿をたくさん見てきました。これは通常、xib 自体の配線の問題であると説明されていますが、xib 内のすべての接続を削除すると問題なくロードされますが、ui 要素とファイル所有者の間の接続を追加し直した瞬間にエラーが返されるので、 xibの「クリーンアップ」とは何の関係もないと思います(xibのXMLを見ても、誤った接続がリストされていません)。
このエラーがどのように発生するかについて、他の誰かが考えていますか?