0

Apple の WWDC 2010 コードから TableViewUpdates/TVAnimationGestures を調べましたが、UITableViewCell サブクラスの複製に問題があります。これは私がやったことです:

いくつかの単純なプロパティを持つ新しい UITableViewCell サブクラスを作成しました。

@interface TargetDetailTableViewCell : UITableViewCell

@property (nonatomic, retain) IBOutlet UILabel *DescriptionLabel;
@property (nonatomic, retain) IBOutlet UILabel *ValueLabel;
@property (nonatomic, retain) IBOutlet UIImageView *DotImageView;

.m では、メモリを解放するだけです。IB で、IB にドラッグしたばかりの UITableViewCell のクラスを TargetDetailTableViewCell に変更します。TargetDetailTableViewCell からのアウトレットを適切なラベルと画像ビューに接続します。

クラスでこれを使用したい:

@class TargetDetailTableViewCell;

//some properties
@property (nonatomic, assign) IBOutlet TargetDetailTableViewCell *TargetCell;

.m で:

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

    if (cell == nil) {
        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;
    }
// set some labels
return cell;
}

実行すると、次のエラーが表示されます。Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Apple の例と私の例との違いは、IB で UITableViewCell のサブクラスを Ctrl キーを押しながらクリックすると、File's Owner プロパティが設定されていることだけです。セルを使用するクラスのプロパティとして宣言されているため、コンセントをどのように接続したかはわかりませんが、物理的な IB 接続はありません。誰かが私にそれを説明できますか、それとも私が間違っていることを説明できますか?

また、誰かがこれを説明できれば、それは素晴らしいことです:

        UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
        [nib instantiateWithOwner:self options:nil];
        cell = self.TargetCell;
        self.TargetCell = nil;

ペン先を作成し、メモリからインスタンス化されるペン先の所有者は、あなたがいるクラスまたは自己(私のビューコントローラー)です。それから最後の 2 行は私を混乱させます。新しく作成されたオブジェクトを指すようにセルに指示し、次に新しく作成されたオブジェクトを nil に設定するようなものです。私の頭の中では、セルもnilを指していると思います。ありがとう。

4

1 に答える 1

2

カスタム テーブル ビュー セル nib に所有者が必要であり、その所有者は TableViewDataSource クラスである必要があります (つまり、cellForRowAtIndexPath メソッドを実装し、テーブル セルへの TargetCell アウトレットを持つテーブル ビュー コントローラー)。

また、この TargetCell アウトレットをファイル所有者 (TableViewController) からカスタム テーブル ビューに接続する必要があります。

これは、所有者としてテーブル ビュー コントローラーを使用して nib をロードすると、ペン先で定義されたテーブル ビュー セルを指すようにアウトレット (TargetCell プロパティ) が設定されるためです。

次に、この参照を cell メソッド変数にコピーし、構成して返します。cellForRowAtIndexPath メソッドで使用する nib 内のオブジェクトへの参照を取得するためのブートストラップとしてのみ必要だったため、コピー後にプロパティを nil に割り当てます。

于 2012-02-02T02:08:16.193 に答える