Search code examples
uitableviewios8unrecognized-selectornsindexpath

indexPathForCell unrecognized selector sent to instance on iOS 8 with ObjC


I have a UITextField in UITableViewCell. When user tries to enter some text into this textfield, app scrolls that cell to the top of UITableView.Here is the code:

#pragma mark - UITextField Delegates
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    UITableViewCell *QCELL = (UITableViewCell *)[[[[textField superview]superview]superview]superview];
    UITableView *QTable = (UITableView *)[[QCELL superview] superview];
    NSIndexPath*path = = [QTable indexPathForCell:QCELL];
    return true;
}

and exception

    2014-09-11 11:12:50.604 InspectTHIS[9401:348011] -[UIView indexPathForCell:]: unrecognized selector sent to instance 0x7c2e8b30
    2014-09-11 11:12:50.608 InspectTHIS[9401:348011] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView indexPathForCell:]: unrecognized selector sent to instance 0x7c2e8b30'

Updated - Answered

After I search in Views Layer I found this

////////// iOS 8 //////////

<UIView: 0x792aabd0; frame = (0 0; 768 1023); opaque = NO; autoresize = W+H; layer = <CALayer: 0x792aac40>>
<UITableViewCellContentView: 0x79758340; frame = (0 0; 768 699); opaque = NO; gestureRecognizers =                 <NSArray: 0x79758530>; layer = <CALayer: 0x797583b0>>
<QuestionCell: 0x79757ed0; baseClass = UITableViewCell; frame = (0 0; 768 699); autoresize = W; layer = <CALayer: 0x79758190>>
<UITableViewWrapperView: 0x7967bc50; frame = (0 0; 768 750); gestureRecognizers = <NSArray: 0x7967bef0>; layer = <CALayer: 0x7967be30>; contentOffset: {0, 0}; contentSize: {768, 750}>
<UITableView: 0x78c99600; frame = (0 244; 768 750); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7967b9c0>; layer = <CALayer: 0x7967ae00>; contentOffset: {0, 0}; contentSize: {768, 699}>
<UIView: 0x7967abd0; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0x7967ac40>>

//////// iOS 7 ////

<UIView: 0x11fbbbf0; frame = (0 0; 768 1023); opaque = NO; autoresize = W+H; layer = <CALayer: 0x11fbbc50>>
<UITableViewCellContentView: 0x11f832a0; frame = (0 0; 768 699); opaque = NO; gestureRecognizers =     <NSArray: 0x11f8dd40>; layer = <CALayer: 0x11faa6f0>>
<UITableViewCellScrollView: 0x11fc4090; frame = (0 0; 768 699); autoresize = W+H; gestureRecognizers = <NSArray: 0x11f9c830>; layer = <CALayer: 0x11f978f0>; contentOffset: {0, 0}>
<QuestionCell: 0x11fa2090; baseClass = UITableViewCell; frame = (0 0; 768 699); autoresize = W; layer = <CALayer: 0x11fa1c90>>
<UITableViewWrapperView: 0xced1860; frame = (0 0; 768 750); autoresize = W+H; layer = <CALayer: 0xced18d0>>
<UITableView: 0xd958800; frame = (0 244; 768 750); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0xced1560>; layer = <CALayer: 0xced0eb0>; contentOffset: {0, 0}>
<UIView: 0xced0c30; frame = (0 0; 768 1024); autoresize = RM+BM; layer = <CALayer: 0xced0c90>>

as you can see in iOS 8, UITableViewCellScrollView is missing and and I can't go up like I did in iOS 7. so i change the code like this.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    NSIndexPath*path;
    UITableView *QTable;
    CGFloat version =[[[UIDevice currentDevice] systemVersion] floatValue];
    if (version >= 7.0)
    {
        UITableViewCell *QCELL = (UITableViewCell *)[[[[textField superview]superview]superview]superview];
        QTable = (UITableView *)[[QCELL superview] superview];
        path  = [QTable indexPathForCell:QCELL];
    }
    else if(version >= 8.0)
    {
        UITableViewCell *QCELL = (UITableViewCell *)[[[textField superview]superview]superview];
        QTable = (UITableView *)[[QCELL superview] superview];
        path  = [QTable indexPathForCell:QCELL];
    }

    NSIndexPath*path = = [QTable indexPathForCell:QCELL];
    return true;
}

Solution

  • Similarly I had a button inside a UITableViewCell.This will work for you. Here buttonView means my UIButton instance For iOS 8

    UITableViewCell *cell = (UITableViewCell*)[buttonView superview];
    

    gave me the UITableViewCell instance and for iOS 7 as usual

    UITableViewCell *cell = [buttonView superview]superview];
    

    gave me the UITableViewCell instance

    And the

    [QTable indexPathForCell:cell];

    Will give you the NSIndexPath(This part is ok in the given answer).