0

私は indexPath.row を使用して、テーブルビューのどの行で何かを行うかを決定します。私のセルのタイトルには、最初の行に 1、最後の行に 18 の数字が含まれているため、18 行あります。これは最初の11行で機能しますが、その後、タイトルにランダムに生成されたように見える数字があります! 時には 16、次に 5、次に 18、そして 12... などです。何が問題なのですか / indexPath.row 変数がそのように動作するのはなぜですか?

私の cellForRowAtIndexPath メソッド:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *MyIdentifier = @"MyIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil];
    cell = cell0;
    self.cell0 = nil;
}
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];

return cell;  

}

問題を解決する方法について、他に何か提案はありますか? 今まで動かなかったのに…

// さらにコードを追加して更新します:

セルを宣言する方法は次のとおりです。これは、ライブラリのセルをIBに入れただけのXIBファイル(テンプレート「空のXIB」)にあります。

@interface myViewController : UITableViewController {

    UITableViewCell *cell0;
}

@property (nonatomic, retain) IBOutlet UITableViewCell *cell0;

次に、myViewController.m ファイルの先頭で:

@synthesize cell0;

私の cellForRowAtIndexPath メソッドは既に上に投稿されています。SDK ドキュメントの cellForRowAtIndexPath メソッドと同等であり、Apple の例では機能しているようです。

4

5 に答える 5

1

cell0 で何を達成しようとしていますか?

cell = cell0;
self.cell0 = nil;

新しいセルを作成しているように見えますが、どういうわけか古いセルを使用することにしました。本当の犯人は、セルをロードしているコードが実際にどこかに割り当てられているように見えます。

代わりにこれだけを試してください:

if (cell == nil) {
    cell = [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil];
}

多分:

if (cell == nil)
{
     // TODO: try to avoid view controller
     UIViewController *vc = [[UIViewController alloc] initWithNibName:@"IndividualContractWithResult" bundle:nil];
     cell = (IndividualContractWithResult_Cell *) vc.view;
     [vc release];
}
于 2009-11-11T23:55:30.497 に答える
0

テーブルビューのセルを作成するコードを指定すると、答えが簡単になります。
セルの再利用には問題があるようです。新しい値を設定せずに、以前に作成したセルを再利用します。

于 2009-11-11T11:45:33.057 に答える
0

セルを再利用しているのではなく、使用可能なセルがあるときに新しいセルを作成しているようです。dequeueReusableCellWithIdentifierのサンプルコードを見てください。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MyCell"] autorelease];
    }

    cell.text = <your code here>;
    return cell;
}
于 2009-11-11T11:58:46.490 に答える
0

cell0を保持して自動解放する必要があります。そうしないと、を設定するとself.cell0 = nilcell0既知の参照がなくなります。

cell = [[cell0 retain] autorelease];
self.cell0 = nil;

これを行うこともできます:

cell = self.cell0;
self.cell0 = nil;

..すべてのretainプロパティは、保持/自動解放パターンを使用してゲッターを実装する必要があるためです。

于 2009-11-26T15:10:29.773 に答える
0

ここでプロパティに誤ってアクセスしているようです:

cell = cell0;
self.cell0 = nil;

cell0 という名前のインスタンス変数があると仮定して、それを nil に設定すると、使用する準備が整う前に解放される可能性があります。

これを行う適切な方法は次のとおりです。

cell = self.cell0;
self.cell0 = nil;

このように、cell0 が保持として宣言されている場合は、自動解放された cell0 が自動的に返されますが、cell0 を直接参照すると (self. ではありません)、保持されていない参照が取得され、self.cell0 = nil のときに消えます。呼ばれた。

ここで nib ベースのセルを使用する利点は、タグではなくアウトレットを使用してサブビューを識別できることです。面倒な作業はすでに完了しています。アウトレットを追加し、UITableViewCell をサブクラス化して、ラベルにアクセスすることもできます。

于 2009-11-26T15:01:20.533 に答える