6

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を見ても、誤った接続がリストされていません)。

このエラーがどのように発生するかについて、他の誰かが考えていますか?

4

3 に答える 3

2

Cell Nibファイルで「messageLabelとstatusLabel」のアウトレットを接続しましたか?このエラーは、"statusLabel" の IBOutlet プロパティが Nib ファイルに見つからないことを示しています (接続の問題)。

于 2014-01-04T00:23:03.157 に答える
0

また、MyCell.xib ファイルが (誤って!) 内部に追加されていないかどうかを確認します。

Target Settings -> Build Phases -> Compile Sources

コンパイル ソースはすべての .m ファイル用であり、.Xib リソース ファイル用ではありません。

コピー バンドル リソースは、.Xib リソース ファイル用です。

于 2016-07-16T06:23:46.003 に答える