0

カスタムセルを含むテーブルビューがあります。各セルには、アラートを促すボタンが含まれています。

アラートは期待どおりに UIAlertView デリゲートを使用し、ボタンのタイトルをチェックして、ユーザーが何を押したかを判断します。これにより、データを送信する Web サービスが呼び出されます。送信が完了したら、そのセルのボタンを別のボタン イメージに変更する必要があります。

サーバーに送信された更新を反映するようにデータをリロードしてから、テーブルビューをリロードしても効果はありません。

cellForRowAtIndexPath の外側のセルにアクセスする方法はありますか? 押したボタンに基づいてselectedIndexという名前のグローバル変数を設定していますが、それは私が得ることができる限りです。この方法でセルにアクセスすることはもっともらしい(または良い考えです)でしょうか。

助けてくれてありがとう!

4

2 に答える 2

0

テーブルビューにデータをリロードする方法はいくつかあります。しかし、あなたの場合、セルへの参照を取得できれば、UI 関連の変更 (画像の変更など) をほとんど行うだけで十分です。

Web サービスが応答を返した後にテーブルのコンテンツ サイズが変わると思われる場合は、テーブルをリロードする必要があります。もちろん、テーブルのコンテンツ全体、またはいくつかの行またはセクションのみを再読み込みできます。詳細については、公式ドキュメントを参照してください。

グローバル変数は、ボタンが押されたセルのインデックスを取得する良い方法ではありません。tagボタンのプロパティを使用する場合は、より良いアプローチになります。indexPathの行(またはスキーマが何であれセクション)でボタンのタグを設定します。tag次に、ボタンのセレクター メソッドでを取得できます。

Web サービスの呼び出しが終了したときにセルへの参照を取得し、NSIndexPathviaのインスタンスを取得しますindexPathForRow:inSection:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];

セルがまだ表示されているかどうかを確認し、次に進みます。

MyCustomCell *cell = (MyCustomCell *)[self.tblView cellForRowAtIndexPath:indexPath];

そこでそのセルに変更を加えます。

于 2013-10-12T03:56:49.340 に答える
0

UITableView には、-cellForRowAtIndexPath: というメソッド (デリゲート メソッドではない) があります。セルがまだ表示されていて、インデックス パスを保存していれば、それを使用してセルを取得できます。セルが表示されていない場合は nil を返します (ただし、その場合、デリゲート メソッドは後で呼び出されて、表示される前にそのインデックス パスのセルを再度提供するため、構成します)。

Web サービスの呼び出しはおそらく非同期であり、ユーザーがボタンを押してから Web 応答を受け取るまでの間に多くのことが変化する可能性があることに注意してください。ユーザーがセルを画面外にスクロールして表示されなくなった可能性があります。その場合、後でセルを適切に構成できるように、更新された値を保存する必要があります。また、何らかの理由でコードが reloadData を呼び出す場合、NSIndexPath を維持しても意味がない場合があります。基になるモデルがまったく変更されている場合、ユーザーのクリックに関連付けられたモデル レコードは完全に異なる NSIndexPath になる可能性があります (またはデータセットにはまったく存在しません)。状況に応じて、問題がある場合とない場合がありますが、問題がある場合は、選択したレコードへの参照を保持することをお勧めします(またはそのレコードの主キー)、呼び出しが戻ってきたら、そのレコードへのインデックス パスが現在何であるかを判断し、そのインデックス パスのセルが表示されているかどうかを確認します。

最後に、グローバルではなく、View Controller のプロパティを使用してこれらの値を保存することをお勧めします。ビュー コントローラの新しいインスタンスを作成し、グローバル変数の値に基づいて動作を変更した場合、そのビュー コントローラ クラスの以前の使用法から (完全に偽の値で) 設定されている可能性があります。

于 2013-10-12T03:30:55.183 に答える