indexPathForCell无法识别的选择器发送到iOS 8与ObjC实例

问题描述:

我在UITableViewCell中有一个UITextField。当用户尝试输入一些文字到这个文本框,滚动应用该单元格UITableView.Here的顶部是代码:indexPathForCell无法识别的选择器发送到iOS 8与ObjC实例

#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; 
} 

和异常

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' 

更新 - 已回答

后我在视图层搜索我发现这个

////////// 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>> 

,你可以在iOS 8的看到,UITableViewCellScrollView失踪,我不能去像我在的iOS 7做所以我改变了这样的代码。

- (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; 
} 
+0

如果文本字段在文本视图单元格内,那么'QCELL'不应该只是'[textField superview]'? – *foe 2014-09-11 08:24:12

+0

我测试上面的例子,它不起作用 – wod 2014-10-18 21:16:53

+0

@wod什么似乎是问题? – 2014-10-19 22:09:21

同样,我有一个UITableViewCell内的按钮。这将为你工作。这里buttonView意味着我的UIButton实例 对于iOS 8

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

给我的UITableViewCell实例 和iOS的7照常

UITableViewCell *cell = [buttonView superview]superview]; 

给我的UITableViewCell实例

[QTable indexPathForCell:cell];

会给你NSIndexPath(这部分在给定的答案中可以)。

这就是遍历视图层次结构而不是使用单元格本身的委托方法得到的结果。

使单元本身响应textview的委托。让单元拥有它自己的协议(委托方法),并让你的TableViewController成为委托。

然后你在子类的UITableViewCell类代码将是这个样子:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{ 

    [self.delegate textFieldDidBeginEditingForCell:self]; 
    return true; 
} 

然后在您的TableViewController:

- (void)textFieldDidBeginEditingForCell:(YourCustomCell*)cell 
{ 
    NSIndexPath *path = [QTable indexPathForCell:cell]; 

    ... 
} 

我改变你原来的代码一点点,这个就出来了:

我做了这个改变,因为当版本是8时,如果> = 7被解雇了,我有问题。我需要if之外的变量。

CGFloat version =[[[UIDevice currentDevice] systemVersion] floatValue]; 
UITableViewCell *cell; 
UITableView *table; 

if ((version > 7) && (version < 8)) 
{ 
    UITableViewCell *cell = (UITableViewCell*)[[[sender superview] superview]superview]; 
    table = (UITableView *)cell.superview.superview; 


} 
else if(version > 8) 
{ 
    UITableViewCell *cell = (UITableViewCell*)[[sender superview] superview]; 
    table = (UITableView *)cell.superview.superview; 

} 
+0

谢谢。我在那些陈述中遇到了同样的问题。现在,它看起来像这样 如果(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@ “8.0”)){ ... }否则,如果(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@ “7.0”)){ ... } 其中的#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(V )([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch]!= NSOrderedAscending) – 2014-12-05 08:21:19