2

だから私は、UITableViewすべてのセルが を持つUITextFieldサブビューとしてそれらの中に を持っていtag=1ます。私を悩ませているのは、ユーザーが textField をクリックして編集したときに、それがどの行で発生したかを知りたいということです。私がそれを解決できると思うのは、サブビュー(UITextField)が選択されたときにセル自体を選択させることです。どうすればそれを達成できますか?

配列でやってみたのですが、セルが再利用されているのでうまくいきません。すべての行をループするのは、単純に遅すぎます。

4

6 に答える 6

2

UITextFieldデフォルトで各セルの を無効にし、UITableViewデリゲート メソッドdidSelectRowAtIndexPath:を使用して

  1. 選択した行の indexPath をプロパティに格納します
  2. 有効にするUITextField
  3. UITextFieldファーストレスポンダーを作る

クラス拡張でプロパティを定義します。

@interface MyTableViewController ()
@property (strong, nonatomic) NSIndexPath *activeIndex;
@end

の実装でdidSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    self.activeIndex = indexPath;
    AddCell *selectedCell = (AddCell *)[self.tableView cellForRowAtIndexPath:indexPath];
    [selectedCell.textField setEnabled:YES];
    [selectedCell.textField becomeFirstResponder];
}

UITextFieldファーストレスポンダ ステータスを辞任するときは、再度無効にする必要があります。

UITableViewControlleryourが each のデリゲートであると仮定すると、メソッドUITextFieldの実装でこれを行うことができます。UITextFieldDelegate

-(void)textFieldDidEndEditing:(UITextField *)textField 
{
    [textField setEnabled:NO];
}
于 2013-12-05T18:09:23.710 に答える
0

を使用して、ユーザーが( を使用して)UITextFieldDelegateの編集を開始したことを認識します。UITextFieldtextFieldDidBeginEditing:

次に2つの解決策:

解決策 1 : セルをサブクラス化し、のデリゲートにしUITextFieldます。

次に、textFieldDidBeginEditing:カスタム セルで、セルを選択します。

// MyCustomCell.m
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self setSelected:YES animated:YES];
}

解決策 2 : ビュー コントローラーをUITextFieldデリゲートにし、そこから適切なセルを選択します。

// MyTableViewController.m
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    // Find the cell containing our UITextField
    UIView *cell = textField.superview;
    while (![cell isKindOfClass:[UITableViewCell class]])
    {
        cell = cell.superview;
    }

    // Make the cell selected
    [(UITableViewCell *)cell setSelected:YES animated:YES];
}

Andrey Chevozerov が回答の 1 つのコメントで述べたように、最初の解決策をお勧めします。

そのようなタスクにはスーパービューを使用しない方がよいでしょう。特にカスケードで。

于 2013-07-08T09:43:29.340 に答える
0

以下のコードは NSIndexPath を返します。これはUITextField デリゲートで記述できます-

[tableView indexPathForRowAtPoint:textField.superview.superview.frame.origin];

コードの上で試してみてください。

于 2013-07-08T09:45:47.753 に答える
-2

なぜテキストフィールドにタグを使用しているのですか? 適切な方法は次のとおりです。

  1. セルのカスタム クラスを作成します。
  2. あなたのアウトレットを作りますUITextField
  3. セルを作成するときに、View Controller をセルのテキスト フィールドのデリゲートとして割り当てます。
  4. タグ ==indexPath.rowを対応するセルのテキスト フィールドに割り当てます。
  5. textFieldShouldBeginEditingセルを選択するためのコードを配置します。

    [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:textfield.tag inSection:0] アニメーション:YES scrollPosition:UITableViewScrollPositionNone];

于 2013-07-08T09:37:13.900 に答える