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'
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;
}
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).