14

カスタムセルに2つのテキストフィールドがあります。テキストフィールドデリゲートメソッドでTableviewセルのインデックスパス値を取得する方法ユーザーから入力値を取得して、関連するオブジェクトに保存します。ユーザーはセルのボタン(追加)をクリックしてセルを追加できます。

ここに画像の説明を入力してください

前もって感謝します...

4

11 に答える 11

18

iOS7にアップデートしてください!

iOS7の新機能により、コードは次のようになります。

UITableViewCell *textFieldRowCell;

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
    textFieldRowCell = (UITableViewCell *) textField.superview.superview;

} else {
    // Load resources for iOS 7 or later
    textFieldRowCell = (UITableViewCell *) textField.superview.superview.superview; 
   // TextField -> UITableVieCellContentView -> (in iOS 7!)ScrollView -> Whoola!
}

NSIndexPath *indexPath = [self.tableView indexPathForCell:textFieldRowCell];
于 2013-10-03T12:23:09.970 に答える
13

より動的なソリューション(ハードコードされたスーパービューレベルがなく、iOSバージョンごとに同じコードがあります)。

さらに、indexPathForCell:セルが表示されていない場合は機能しません。そのため、回避策として使用indexPathForRowAtPoint:します。

//find the UITableViewcell superview
UIView *cell = textField;
while (cell && ![cell isKindOfClass:[UITableViewCell class]])
    cell = cell.superview;

//use the UITableViewcell superview to get the NSIndexPath
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:cell.center];
于 2014-06-16T15:12:59.253 に答える
10

これは私がそれをやっていて、幸運を持っている方法です。textFieldフレームの原点を取得します。それをポイントに変換します。次に、ポイントをインデックスパスに変換します。

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGPoint origin = textField.frame.origin;
    CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];

    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint:point];

    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

}
于 2015-01-30T14:59:40.837 に答える
4

tableviewこのメソッドを試して、コントローラーからどこでも動的にテキストフィールドを取得してください

 #pragma mark - Get textfield indexpath
- (NSIndexPath *)TextFieldIndexpath:(UITextField *)textField
{
    CGPoint point = [textField.superview convertPoint:textField.frame.origin toView:self.TblView];
    NSIndexPath * indexPath = [self.TblView indexPathForRowAtPoint:point];
    NSLog(@"Indexpath = %@", indexPath);
    return indexPath;
}
于 2015-06-05T09:43:14.127 に答える
2

indexPathを取得するには、次のコードを試してください。

    UIView *contentView = (UIVIew *)[textfield superview];
    UITableViewCell *cell = (UITableViewCell *)[contentView superview];
    if(IS_IOS7_OR_GREATER) {
        cell = (UITableViewCell *)[[contentView superview] superview];
    }
    NSIndexPath *indexPath = [self.tableview indexPathForCell:cell];

完了しました。

簡単に言うと、

NSIndexPath *indexPath = [self.tableview indexPathForCell:(UITableViewCell *)[(UIVIew *)[textfield superview] superview]];

if(IS_IOS7_OR_GREATER) {
    cell = (UITableViewCell *)[[[textfield superview] superview] superview];
}

更新された回答を確認してください。

于 2012-09-07T18:26:30.107 に答える
1

セルのインデックスパス値をUITextField tagプロパティに設定すると、次のようなデリゲートメソッドでインデックスパスにアクセスできます。textfield.tag

于 2012-09-07T13:31:29.960 に答える
1

セルとテキストフィールドの両方の情報を格納するように、cellForRowAtIndexPathでテキストフィールドのタグを設定できます。

例:4行目のセルの場合、1番目と2番目のテキストフィールドのタグはそれぞれ41と42になります。同様に、テキストフィールドのタグは5行目では51と52である必要があります。

次に、テキストフィールドデリゲートメソッドで、textfield.tagを取得してアクティブなテキストフィールドを識別できます。

于 2014-06-19T06:58:23.710 に答える
1

これは、関連するオブジェクト(NSIndexPathである必要はありません)を使用して、任意のインスタンス(UITextFieldである必要はありません)のObjective-Cランタイムで実行できます。

この質問では、カテゴリを作成できますUIView+RepresentingIndexPath

私たちのインターフェースでは、NSIndexPathを設定および取得できます。

@interface UIView (RepresentingIndexPath)
- (void)representIndexPath:(NSIndexPath *)indexPath;
- (NSIndexPath *)representedIndexPath;
@end

この実装では、Objective-Cに関連付けられたオブジェクトを使用して、ビューのインデックスパスを設定および取得します。

#import "UIView+RepresentingIndexPath.h"
#import <objc/runtime.h>

static char IndexPathKey;

@implementation UIView (RepresentingIndexPath)

- (void)representIndexPath:(NSIndexPath *)indexPath
{
    objc_setAssociatedObject(self, &IndexPathKey, indexPath, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSIndexPath *)representedIndexPath
{
    return objc_getAssociatedObject(self, &IndexPathKey);
}

@end

動作中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TextFieldTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextFieldCell" forIndexPath:indexPath];
    [cell.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];
    [cell.textField representIndexPath:indexPath];
    return cell;
}

- (void)textFieldTextChanged:(UITextField *)sender
{
    NSIndexPath *indexPath = [sender representedIndexPath];
    NSLog(@"%@", indexPath);
}

最後にもう1つ!実行しようとしていることを実行せずに達成できる場合は、実行時の混乱を実際に回避する必要があります。別の解決策を追加しようと思っただけです!

于 2015-04-01T10:04:12.933 に答える
1

UITextField内にあるセルのインデックスパスを見つける方法を検索すると、この回答が見つかります。

したがって、上記の回答のおかげで、コードをここに配置しました。

- (void)searchSelectedIndexPath:(UIView*)view {
    // This allow to find selected index path for a table view cell with a text field inside.
    for (UIView* subview in view.subviews) {
        if ([view isKindOfClass:[UITextField class]]) {
            if ([view isFirstResponder]) {
                UIView *cell = view;
                while (cell && ![cell isKindOfClass:[UITableViewCell class]]) {
                    cell = cell.superview;
                }
                self.selectedIndexPath = [self.tableView indexPathForRowAtPoint:cell.center];
                return;
            }
        }
        [self searchSelectedIndexPath:subview];
    }
}

このようにして、キーボード通知が発生するタイミングは次のとおりです。

- (void)keyboardDidShow:(NSNotification*)notification {
    [self searchSelectedIndexPath:self.tableView];
}
于 2016-06-22T07:49:20.267 に答える
0

私のような誰かが@Kerknessの答え(これは本当に私のために働いた)を迅速に必要とする場合:

func textFieldDidBeginEditing(_ textField: UITextField) {
    let origin: CGPoint = textField.frame.origin
    let point: CGPoint? = textField.superview?.convert(origin, to: tableView)
    let indexPath: IndexPath? = tableView.indexPathForRow(at: point ?? CGPoint.zero)
    tableView.scrollToRow(at: indexPath!, at: .middle, animated: true)
}

それは十分に単純なはずです:あなたはポイントを取得し、次にindexPathを取得し、それを使って必要なことを何でもします!

于 2017-11-09T17:28:08.200 に答える
-1

ありがとう、@ Luka、それは素晴らしい方法で動作します。これが迅速な4つの解決策です。

var selectedIndexPath: IndexPath?

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowHide(_ :)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShowHide(_ :)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}


func searchSelectedIndexPath(view: UIView) {
    view.subviews.forEach { (subview) in
        if view is UITextView, view.isFirstResponder == true {
            var cell:UIView? = view;
            while cell != nil && !(cell is UITableViewCell) {
                cell = cell?.superview;
            }
            if cell != nil {
                self.selectedIndexPath = self.dashBoardTableView.indexPathForRow(at: (cell?.center)!)
                return
            }
        }
        self.searchSelectedIndexPath(view: subview)
    }
}

// Keyboard notification observer menthod
@objc fileprivate func keyboardWillShowHide(_ notification: NSNotification){
     if notification.name == NSNotification.Name.UIKeyboardWillShow {

        UIView.animate(withDuration: duration, animations: { () -> Void in
            self.selectedIndexPath = nil;
            self.searchSelectedIndexPath(view: self.tableView)
            if let indexpath = self.selectedIndexPath {
                self.tableView.scrollToRow(at: indexpath, at: .top, animated: false)
            } else{
                self.bottomContriant.constant = keyboardHeight
                self.view.layoutSubviews()
            }
        })
    } else {
        self.bottomContriant.constant = 15
        UIView.animate(withDuration: duration, animations: { () -> Void in
            self.view.layoutIfNeeded()
        })
    }
}
于 2018-06-27T15:54:09.097 に答える