2013-04-09 8 views
6

私のアプリでは、すべてのセルの内部にとUITextFieldがあります。しかし、私は以前/次のボタンを前/次のテキストフィールドを最初のレスポンダにするために前/次のボタンを実装するのに苦労しています。UITableViewのPrev./Nextボタンを実装して、最初のレスポンダを非表示セルのUITextFieldにする

私は、prev./nextボタンが押されたときに特定のメソッドを呼び出すようにUITableViewCellクラスをサブクラス化し、セル自体をこのメソッドのパラメータとして渡します(したがって、インデックスパスを取得できますデリゲートのメソッドの実装では、テキストフィールドファーストレスポンダにする必要がある)

セルのインデックスパスである計算には、I:

  • は、ボタンが押されたセルのインデックスパスを取得します
  • インデックスpaに1を加算または減算するそのセルの目(押された応じたボタン)

問題テキストフィールド最初のレスポンダを作る、そのテキストフィールドテーブルビュー

  • -cellForRowAtIndexPath:方法を用いて第1の応答を行わなければならないセルを得ます-cellForRowAtIndexPath:メソッドは、可視である場合にのみセルを返します。したがって、セルが表示されていないときは、nilが返され、上記のアルゴリズムは動作しませんが、セルが画面上にあるときは正しく動作します。

    これは私の前のコードです。

    - (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
    { 
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
        NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 
    
        MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
        [newCell.textField becomeFirstResponder]; 
    } 
    

    は、私はそのテキストを作ることができるように表示されていないセルを「取得」する方法はあります:ボタンは、MUInfoMateriaTableViewCellUITableViewCellの私のサブクラスであり、それはそのテキストフィールドを返すtextField性質を持っていることをことを提供しました最初のレスポンダーを入力しますか?または、この問題を回避する別のアルゴリズムを教えてください。

  • 答えて

    7

    については

    あなたは、多段階のプロセスでこの問題を解決することができます。

    • が計算ファーストレスポンダを作るために必要なテキストフィールドを含むセルを追跡表示されるセルのNSIndexPathを呼び出し、表示するには[self.tableView scrollToRowAtIndexPath:atScrollPosition:animated:]を呼び出してください。
    • tableView:willDisplayCell:forRowAtIndexPath:所望の細胞上それが目に見えるようになると、それは受信機が任意のウィンドウのサブビューでない場合becomeFirstResponderを呼び出すと、何もしないので、最後のステップが重要です

    所望の細胞またはインデックスパスと一致します。

    +0

    テキストフィールドが最初のレスポンダーになるセルを追跡するにはどうすればよいですか? 'activeCellIndexPath'のような名前のivarを用意し、アクティブなセルのインデックスパスが' tableView:willDisplayCell:forRowAtIndexPath: 'でパラメータとして渡されたセルのインデックスパスと一致するかどうかをチェックするか、より効率的ですアプローチ? – BigLex

    +0

    ちょうどそれを記述した方法を正確に実装します。セルをレスポンダにしたくない場合や、 'activeCellIndexPath'を' nil'しない場合は、必ず処理してください。 – jszumski

    +0

    ありがとうございます! – BigLex

    3

    scrollToRowAtIndexPath:atScrollPosition:animated:を使用して、テーブルビューをスクロールしてセルを表示させます。インスタンス

    - (void)prevButtonPressedInCell:(MUInfoMateriaTableViewCell *)cell 
    { 
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
        NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:indexPath.section]; 
    
        [self.tableView scrollToRowAtIndexPath:previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
    
        MUInfoMateriaTableViewCell *newCell = (MUInfoMateriaTableViewCell *)[self.tableView cellForRowAtIndexPath:previousIndexPath]; 
        [newCell.textField becomeFirstResponder]; 
    } 
    
    -1

    問題点は、-cellForRowAtIndexPath:メソッドは、セルが表示されている場合にのみ を返します。

    行が表示されていないときにセルが存在しないためです。 UITableViewは、テーブルを描画するために必要なセルだけを保持します。そのため、テーブルをスクロールするときに多くの-tableView:cellForRowAtIndexPath:メッセージが表示されます。このテーブルでは、データソースに、それがないセルを提供するよう要求しています。

    現在の方法を使用する場合は、Gabriele Petronellaの答えに示すように、編集する行が表示されるように表をスクロールする必要があります。

    +0

    これは間違っています。 'tableView:cellForRowAtIndexPath:'の典型的な実装を見ると、何が起こるのかが分かります。常にセルを返しますが、現在表示されていない場合は、そのインデックスパスの新しいセルを作成する必要があります。または、まだセルキャッシュに保持されている場合は、既存のセルをデキューして返します。 – Logachu

    +0

    @Logachu私の応答は元の質問の文脈では正しいですが、間違った編集によって '-cellForRowAtIndexPath:'(UITableViewメソッド)が '-tableView:cellForRowAtIndexPath:'(UITableViewDataSourceメソッド)に変更されました。私が答えているのと同じ時に起こったにちがいありません。なぜなら、私は答えの中で間違ったテキストを引用にコピーしたからです。私は見積もりと質問を修正しました。あなたがUITableViewを使って私の答えを読んでいるなら(そしておそらく[the docs](http://bit.ly/KF1He4)をチェックしてください)、正しいことに同意することを願っています。 – Caleb

    関連する問題