0

インターフェイスビルダーを使用して独自のカスタム UITableViewCell を作成しています。iOS 5 & iOS 6 をサポートしていますが、Storyboard を使用したくありません。ストーリーボードを提案しないでください。私はInterface Builderに固執し、プログラムで書いています。

UITableViewCell をサブクラス化するクラスを作成しました。.h ファイルは次のとおりです。

@interface CategoryCell : UITableViewCell
{
    __weak IBOutlet UIImageView *image;
    __weak IBOutlet UILabel *name;
    __weak IBOutlet UILabel *distance;
    __weak IBOutlet UILabel *number;
    __weak IBOutlet UIImageView *rating;
}

@property (nonatomic, weak) IBOutlet UIImageView *image;
@property (nonatomic, weak) IBOutlet UILabel *name;
@property (nonatomic, weak) IBOutlet UILabel *distance;
@property (nonatomic, weak) IBOutlet UILabel *number;
@property (nonatomic, weak) IBOutlet UIImageView *rating;

@end

XIB ファイルは UIViewController タイプで、CategoryCell タイプのビューを持っています。必要に応じてコンセントを接続しました。

問題

dequeueResuableCellWithIdentifierカスタムセルを呼び出していません。ここに私が持っているものがあります:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *cellIdentifier = @"CategoryCell";
        CategoryCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

        if (cell == nil) {

            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CategoryCell" owner:self options:nil];
            cell = [topLevelObjects objectAtIndex:0];
            .....
        }
        return cell
}

loadBundle行を:に置き換えると、cell = [[CategoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];機能します。しかし、ニブはロードされません。したがって、セルはロードされますが、自分のセルはロードされないため、必要なラベルと画像を設定できません。(上記のサンプルが示すように) 通常のロード バンドル行を追加しinit、カスタム セルのメソッドにブレークポイントを追加すると、呼び出されません。また、シミュレーターで iPhone 画面全体を上書きする完全な白い画面が表示されます。

なぜそれが起こっているのですか?ここで何が間違っていますか?アウトレットをに設定しようとしたときstrong(私はそうすべきではないことを知っています)、それも機能しません。

編集

NSBundle 行を次のように置き換えて修正しました。

UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"CategoryCell" bundle:nil];
cell = (CategoryCell *)temporaryController.view;

NSBundle メソッドで間違ったことをしたのは何ですか? おそらく、それはそれを行うための「より簡単な」方法であるはずです。

4

2 に答える 2

6

テーブルビューでregisterNibメソッドを試したことはありますか?iOS5からペン先をロードするのに非常に便利です。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerNib:[UINib nibWithNibName:@"CategoryCell" bundle:nil]
         forCellReuseIdentifier:@"CategoryCell"];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CategoryCell";
    CategoryCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    return cell
}

CategoryCell.nibに識別子が定義されていることを確認してください。これは属性インスペクターの下にあります。この仕事を願っています。

于 2012-11-25T03:36:55.543 に答える
0

XIB ファイルは UIViewController タイプで、CategoryCell タイプのビューを持っています。必要に応じてコンセントを接続しました。

これの問題は、XIB のルート オブジェクトが UITableViewCell またはそのサブクラスである必要があることです。
そして、必ず再利用識別子を XIB に設定してください。

于 2012-11-24T22:50:13.367 に答える