2011-11-21 8 views
6

私は、いくつかのカスタムUITableCellを含むUITableを持っています。これらのセルには、いくつかのUILabelsとUITextFieldが含まれています。テーブルのデータソースは、メインコントローラのプロパティから取得されます。 (このコントローラーもデリゲートとテーブルのdataSourceです)。ここでセルの1つの内部でUITextFieldを編集するときに、UITableを即座にリロードします。

は、UIの単純化されたスクリーンショットです:今

schreenshot

、私は、ユーザーがUITextFieldsのいずれかを編集したときに「オンザフライ」のすべてのUILabelsの内容を更新する必要があります。 これを行うには、私はUITextFieldレベルで "Editing Changed"イベントを聞いています。これは、次のアクションをトリガー:のViewControllerで

- (IBAction) editChangeHandler: (id) sender { 
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]]; 
    [delegate.viewController reloadRows]; 
} 

reloadRows方法は、次のような次のとおりです。ここでは

- (void) reloadRows { 
    NSLog(@"called reloadRows"); 
    //perform some calculations on the data source objects here... 
    [theUITable reloadData]; 
} 

私の問題は、ユーザーがフィールドに値を変更するたびに、reloadRowsメソッドが正常であるということです明らかにreloadDataが呼び出されますが、これもまたキーボードを破棄する原因となります。

最終的に、キーボードが閉じられてテーブルがリロードされる前に、TextFieldを編集するときにユーザーは1つのキーに触れることができます。

誰かがこれに対する解決策を知っているか、同じ問題を経験していますか?

答えて

3

テーブル全体を更新するのではなく、必要に応じて選択的に行を修正することができます(これは、現在作業しているセルを更新して状態をリセットすることです)。あなたがそれらのセルを再構築する必要がしたくない場合は

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath 

:で

ルック:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

また、あなたはを介して細胞を得ることにより、直接、それらのセルを編集することができます。

+0

Arf!ありがとうございました !キーボードの解任はセル状態の再設定によって実際に説明されました。どのように私はそれを見ていないだろうか?:-)私は現在の行のラベルも更新する必要があったので、2番目の提案に従って終了し、個々の行のラベルのみを更新するコントローラに新しいメソッドを書きました。 – Saze

3

同じ問題が発生しました。私の場合、ジェネリックコントローラを作成しようとしていたので、手動でセルを再構築するための特定のメソッドを記述するのは良い選択肢ではありませんでした。

  1. ファーストレスポンダになって一時的にテーブルにいくつかの他のセル内のテキストフィールドを作る:ここ

    は私が思いついたのソリューションです。

  2. reloadRowsAtIndexPathsを呼び出して、ユーザーが編集中のセルをリロードします。
  3. 編集していたフィールドを最初のレスポンダに再び設定します。

これは魅力的です。キーボードはまったく点滅しないまま表示され、セルは適切にリフレッシュされ、ユーザは元々編集していたのと同じフィールドに入力を続けることができます。

関連する問題