13

それぞれに がありUITableViewます。ViewController に、各セルのテキスト フィールドの「Did End On Exit」イベントを処理するメソッドがあり、できるようにしたいのは、モデル データを新しいテキストで更新することです。UITextFieldUITableViewCells

私が現在持っているものは次のとおりです。

- (IBAction)itemFinishedEditing:(id)sender {
    [sender resignFirstResponder];

    UITextField *field = sender;
    UITableViewCell *cell = (UITableViewCell *) field.superview.superview.superview;

    NSIndexPath *indexPath = [_tableView indexPathForCell:cell];

    _list.items[indexPath.row] = field.text;
}

もちろんうまくfield.superview.superview.superviewいきますが、それはとてもハックなようです。もっとエレガントな方法はありますか?のタグをUITextFieldセルのindexPath.rowに設定cellForRowAtIndexPathすると、行を挿入および削除した後でも、そのタグは常に正しいでしょうか?

.superview細心の注意を払っている人は、1 つ多すぎると思うかもしれませんが、iOS6 の場合はそうです。ただし、iOS7 では、セルのコンテンツ ビューとセル自体の間の階層に余分なビューがあります (NDA によりフォームの作成が妨げられます)。UITableViewCellこれは、どのように実装されているかを知ることに依存し、OS の更新で壊れる可能性があるため、スーパービューの実行が少しハックである理由を正確に示しています。

4

4 に答える 4

31

あなたの目標は実際にはテキスト フィールドのインデックス パスを取得することなので、次のようにすることができます。

- (IBAction)itemFinishedEditing:(UITextField *)field {
    [field resignFirstResponder];

    CGPoint pointInTable = [field convertPoint:field.bounds.origin toView:_tableView];    

    NSIndexPath *indexPath = [_tableView indexPathForRowAtPoint:pointInTable];

    _list.items[indexPath.row] = field.text;
}
于 2013-07-20T02:18:14.380 に答える
12

それを行うためのわずかに優れた方法の 1 つは、ビュー階層を反復処理し、各スーパービューがメソッドUITableViewCellを使用しているかどうかを確認することです。classそうすれば、あなたUITextFieldとセルの間のスーパービューの数に制約されません。

次のようなもの:

UIView *view = field;
while (view && ![view isKindOfClass:[UITableViewCell class]]){ 
    view = view.superview;
}
于 2013-07-20T01:46:05.790 に答える
3

UITableViewCellそれ自体を弱い関連付けとして にアタッチし、メソッドUITextFieldでそれを取り出すことができます。UITextFieldDelegate

const char kTableViewCellAssociatedObjectKey;

UITableViewCell サブクラスで:

- (void)awakeFromNib {
    [super awakeFromNib];
    objc_setAssociatedObject(textField, &kTableViewCellAssociatedObjectKey, OBJC_ASSOCIATION_ASSIGN);
}

UITextFieldDelegate メソッドで:

UITableViewCell *cell = objc_getAssociatedObject(textField, &kTableViewCellAssociatedObjectKey);
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
//...

また、テキスト フィールドが正しいセルに関連付けられるように、セルが UITableView からデキューされるたびに再度関連付けることをお勧めします。

于 2013-07-20T01:47:16.663 に答える