How to get cell indexpath in uitextfield Delegate Methods?

后端 未结 11 982
南旧
南旧 2020-12-08 22:56

I have two textfields in a custom cell how to get the indexpath value of Tableview cell in textfield delegate methods I want to get the input value from user and save it to

相关标签:
11条回答
  • 2020-12-08 23:12

    Try this method to get textfield dynamically anywhere from your tableview controller

     #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;
    }
    
    0 讨论(0)
  • 2020-12-08 23:14

    This is how I have been doing it and have been having better luck. I grab the origin of the textField frame. Convert that to a point. Then convert the point to an index path.

    -(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];
    
    }
    
    0 讨论(0)
  • 2020-12-08 23:15

    I find this answer searching how can I find the index path of a cell with inside a UITextField.

    So, thanks to the answer above, I put my code here, hoping might be usefull.

    - (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];
        }
    }
    

    In this way, when keyboard notification will be raise:

    - (void)keyboardDidShow:(NSNotification*)notification {
        [self searchSelectedIndexPath:self.tableView];
    }
    
    0 讨论(0)
  • 2020-12-08 23:21

    In case somebody like me needs @Kerkness' answer (this one really worked for me) in swift:

    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)
    }
    

    It should be straight forward enough: you get the point then you get the indexPath and do whatever you need with it!

    0 讨论(0)
  • 2020-12-08 23:22

    This can be done in the Objective-C runtime for any instance (doesn't have to be UITextField), with any associated object (doesn't have to be NSIndexPath).

    For this question, we could create a category UIView+RepresentingIndexPath.

    Our interface allows us to set and retrieve an NSIndexPath:

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

    Our implementation uses Objective-C associated objects to set and retrieve an index path on a view:

    #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
    

    In action:

    - (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);
    }
    

    0 讨论(0)
提交回复
热议问题