0

MainViewController に UITableView があります。ユーザーがセルをタップすると、

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

selectedRow = indexPath;

....

[self performSegueWithIdentifier:@"OtherViewControllerSegue" sender:self];
}

それらは別の UIViewController に移動されます (OtherViewController と呼びましょう)。OtherViewController には、選択したセルの名前が設定されます。OtherViewController が閉じられると、MainViewController のセルが新しい名前で更新されます。

[[[mainvc.myTableView cellForRowAtIndexPath:mainvc.selectedRow] textLabel] setText:namecell.textField.text];
    [self.navigationController popViewControllerAnimated:YES];

画面に収まるよりも多くのセルが表示されるまで、これはすべて正常に機能します。画面に収まりきらない数のセル (iPhone の場合は 8、iPad の場合は 16) がある場合、8 番目または 16 番目のセルごとに名前が設定されます。私が間違っていることについてのアイデアはありますか?

アップデート:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [pointsTableView dequeueReusableCellWithIdentifier:@"myTableCell"];
return cell;
}
4

4 に答える 4

2

ビュー (セルのラベル) にデータ (新しい名前) を保存しようとしています。おそらく、データ ソースのcellForRowAtIndexPathメソッドでセルを再利用すると、一部のセルにこのテキストが設定されていて、まだそこに残っている可能性があります。

セル情報として使用する配列に変更を加えてから、テーブル ビューを再読み込みして変更を表示することをお勧めします。

于 2012-06-30T19:05:49.863 に答える
2

これはセルの再利用が原因であり、モデルビューを混同しています(MVC コンテキストで)。

テーブルセルは一時的なもので、画面から消えると、別のセルが必要なときに (新しいセルを作成する代わりに) 再利用されます。これがdequeueReusableCellWithIdentifier:メソッドの機能です。

これは、そこにデータを保存できず、後で有効になることを期待できないことを意味します。この例では、テーブル セルに名前を格納しようとしています。ビューオブジェクトにプロパティ (ラベル テキストなど) を設定する理由は、単に表示するためであり、保存するためではありません。したがって、この問題を解決するには、モデルmainvc内のオブジェクトのリストを維持する必要があります (これは、たとえば、オブジェクトの別のクラスまたは配列にある可能性があります)。次に、cellForRowAtIndexPath:毎回ラベル テキストを設定する必要があります。ラベルがない場合でも、セルが再利用されるため、ラベルを nil または空の文字列に設定する必要があります。これは、セルが最後に使用されたときに何かが含まれている可能性があるためです。

更新:自分自身 を呼び出しcellForRowAtIndexPath:てそのテキストを設定する代わりに、コントローラーのメソッドまたはプロパティを使用してモデルにテキストを設定し、テーブル ビューにそのセルをリロードするように指示する必要があります。コードは次のようになります。

// This code is in where you want to set the text from
[mainvc setText:someText forIndexPath:indexPath];

..そしてあなたのメインView Controllerで:

- (void)setText(NSString*)newText forIndexPath:(NSIndexPath*)indexPath
{
    // Store the text in your model here...
    ...

    // If the view is loaded, the table view should reload the cell.
    if(self.isViewLoaded)
    {
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

cellForRowAtIndexPath:テーブル ビューは、テキストが正しく設定される場所を呼び出します。これは最初は少し複雑に思えるかもしれませんが、Model-View-Controller 設計パターンの使用に慣れると、このように各 MVC コンポーネントのジョブを分離しておくと、コードが整頓され、理解しやすくなり、バグが少なく、更新/拡張が容易です。

于 2012-06-30T19:11:08.323 に答える
0

私が推測するように、あなたはcellForRowAtIndexPath自分で電話するべきではありません。セルを変更するためではなく、セルを作成するために呼び出すことができます。たとえば、必要な文字列をデリゲートを介して最初のビューに渡すことで、テーブルを更新できます。イベント(ユーザーが名前を設定)で、すべてのテーブルを更新し、必要な名前をセルに設定できます。

于 2012-06-30T19:04:04.723 に答える
0

問題が何であるかを正確に言うのは難しいですが、考えられる解決策の1つは次のとおりです。

cellForRowAtIndexPath で、次のようにセルを初期化していることを確認してください。

// Create the Cell
    static NSString *recordCell = @"pickerTableCell";
    cell = [tableView dequeueReusableCellWithIdentifier:recordCell];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:recordCell];
    }

これは主にメモリ ソリューションであることはわかっていますが、ここでも失敗する可能性があります。

また、コードを調べて、名前が変更されたセルをどのように判断しているかを確認してください。気付かないうちに、誤って複数のセルで名前の変更を呼び出している可能性があります

于 2012-06-30T19:04:56.973 に答える