2

を使用してカスタム コントロールを作成していUITableViewます。このコントロールは、1 つのセクションに複数の行がある単なるテーブル ビューです。と呼びましょうMyCustomControl

テーブル ビューのすべてのセルに、UITextFieldコントロールを追加しました。

----------------
| ------------ |
|| Text Field || -> CELL
| ------------ |
----------------

このセルはただの defaultUITableViewCellで、テキストフィールドを追加しました[cell addSubview:textField];

次のようなメソッドを使用して、テーブル ビューのすべてのテキスト フィールド コンポーネントにアクセスできます。

- (UITextField*) textFieldAtIndex:(NSInteger)index
{
    NSIndexPath* indexPath = [NSIndexPath indexPathForRow:index inSection:0];

    UITableViewCell* cell = [self tableView:[self containerTableView] cellForRowAtIndexPath:indexPath];

    UITextField* textField = [[cell subviews] lastObject];

    return textField; // It should returning the reference of textField right??
}

むかしむかし、私はこれMyCustomControlを自分のプロジェクトのどこかのビュー コントローラーで使用しました。

- (void) viewDidLoad
{
    [super viewDidLoad];

    CGPoint origin = CGPointMake(100.f, 100.f);

    CGFloat width = 200.f;

    // Create custom control with text field generated as many as given parameter
    MyCustomControl* textGroup = [[MyCustomControl alloc] initWithOrigin:origin width:width textFieldCount:2];

    // Here is the problem, I try to set current view controllers's text fields 
    // with the text field generated by MyCustomControl.
    // Text field returned are new text field with same properties instead of reference.
    self.txtUsername = [textGroup textFieldAtIndex:0]; // Text Field are copied!
    self.txtPassword = [textGroup textFieldAtIndex:1]; // Not return a pointer!

    [self.txtUsername setDelegate:self]; // Fail
    [self.txtPassword setDelegate:self]; // Fail

    [[self view] addSubview:textGroup]; 

    [[self view] addSubview:[self txtUsername]]; // New text field appeared on view
}

MyCustomControlメソッドからアクセスするテキスト フィールドを完全に制御できるtextFieldAtIndex:と思っていましたが、そのテキスト フィールドを参照する代わりに、View Controller にテキスト フィールドの新しいコピーを取得しました。そして、そのテキストフィールドのデリゲートを設定することも、他のすべてのものをテキストのように設定することもできません。

このテーブル ビュー セルのテキスト フィールドから参照を取得するにはどうすればよいですか?

4

3 に答える 3

3

カスタムセルクラスとテキストフィールドのIBOutletを作成し、cellForRowAtIndexPathで必要としない場所でこのテキストフィールドを非表示にします

テキストフィールドには、新しいものを作成するときにtouchDownアクションメソッドが設定されています (ボタンと同じように、デフォルトで touchUpInside があります。コントロールを選択して接続インスペクターをクリックすると、このオプションを表示できます)。

以下のアプローチから、テキストフィールドの参照を取得できます

- (IBAction)actionTextField:(id)sender {

UIView *view = sender.superview;
while (view && ![view isKindOfClass:[UITableViewCell self]]) view = view.superview;

UITableViewCell *cell = (UITableViewCell *)view;
indexPathForDeletion = [self.tableViewListViewVC indexPathForCell:cell];
NSLog(@"cell is in section %d, row %d", indexPathForDeletion.section, indexPathForDeletion.row);


}
于 2013-09-02T13:25:19.240 に答える
3

これに対する私の回答を確認してください。彼らはテキスト フィールドを望んでいましたが、プロセスは同じで、ここにある他のいくつかのソリューションよりもはるかにクリーンです。

UITableView ラベル テキスト文字列を取得する方法 - カスタム セル

これは、インデックス パスがわかっていることを前提としています。

于 2014-01-22T11:10:03.397 に答える
1

カスタムコントロールクラスのテーブルビューのセルは、カスタムクラスのインスタンスを作成する時点では作成されないため、作成する前にテキストフィールドを割り当てることをお勧めします。これが問題だと思います。各セルからテキストフィールドの参照を取得するには、セルを作成するときに各テキストフィールドにタグ値を指定し、現在のコントローラーでいつでもタグ値でアクセスできます。

于 2013-09-02T10:58:01.303 に答える