2

textField を含むようにカスタマイズされたセルを動的に作成するテーブルを作成しました。プログラムを実行すると、textFields にテキストを入力できます。ただし、プログラムを終了する/別のviewControllerに切り替える前に、入力されたテキストを収集できません。ユーザーが入力したテキストを抽出するにはどうすればよいか教えてください。

次のコードを使用してセルにアクセスできることを理解しています...

for (int section = 1; section < [self.tableView numberOfSections]; section++) // section 0: profile picture
{
    for(int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++)
    {
        NSLog(@"section = %d, row = %d", section, row);
        NSIndexPath *tempIndexPath = [NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell *tempCell = [self tableView:self.tableView cellForRowAtIndexPath:tempIndexPath];
//            NSLog(@"tempCell = %@", tempCell);

    }
}

しかし、それらに含まれるテキストを抽出することはできません。

私も参照しました: Accessing UITextField in a custom UITableViewCell。しかし、私はよりクリーンなソリューションを探しています。

ありがとう!

4

3 に答える 3

1

あなたが参照しているリンクは、必要なことに非常に近いですが、indexPath を取得するためのより良い方法があります。

iOS プログラミングを開始する際のよくある誤解は、データが必要な時点 (ユーザーが [送信] をクリックしたときなど) にテキスト フィールドのすべての値を取得する必要があるというものです。特にテーブルにある場合の問題は、テキスト フィールドが常に使用できるとは限らないことです。セルが画面外にある場合は、存在しない可能性が高いか、テーブルの別の行で再利用されています。テキストフィールドは、データを表示することになっているビューであり、データを保存するモデルとしては機能しません。

そのため、最初に行う必要があるのは、View Controller をプロトコルに準拠させ、View ControllerUITextFieldDelegateを作成するときにテキストフィールドのデリゲートを設定することです。

.h ファイル (<UITextFieldDelegate>重要な部分です):

@interface YourViewController : UIViewController <UITextFieldDelegate>

テキスト フィールドを作成する場合:

myNewTextfield.delegate = self;

これは、テキスト フィールドに重要な変更を通知するように指示します。ここで、テキスト フィールドの編集が終了するとすぐに呼び出されるテキスト フィールド デリゲート メソッドを作成し、テキストを保存できるように呼び出されるのを待つだけです。

- (void) textFieldDidEndEditing:(UITextField *)textField {
    // If you need the index path of the table view cell which contains the text field in order to know how to store it, use:
    CGRect position = [self convertRect:textField.frame toView:self.tableView];
    NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:position];
    NSIndexPath *indexPath = [indexPaths objectAtIndex:0];

    // Save the contents of the text field somewhere so that you have it later when you need it:
    something = textField.text;
}
于 2012-12-24T05:34:40.007 に答える