Uitableview 使用ObjC将无法识别的indexPathForCell选择器发送到iOS 8上的实例

Uitableview 使用ObjC将无法识别的indexPathForCell选择器发送到iOS 8上的实例,uitableview,ios8,unrecognized-selector,nsindexpath,Uitableview,Ios8,Unrecognized Selector,Nsindexpath,我在UITableViewCell中有一个UITextField。当用户尝试在此文本字段中输入一些文本时,应用程序会将该单元格滚动到UITableView的顶部。以下是代码: #pragma mark - UITextField Delegates - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { UITableViewCell *QCELL = (UITableViewCell *)[[[[textField

我在UITableViewCell中有一个UITextField。当用户尝试在此文本字段中输入一些文本时,应用程序会将该单元格滚动到UITableView的顶部。以下是代码:

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

类似地,我在UITableViewCell中有一个按钮。这对您很有用。这里的buttonView表示我的UIButton实例 对于iOS 8

给了我UITableViewCell实例 和往常一样,iOS 7也是如此

UITableViewCell *cell = [buttonView superview]superview];
给了我UITableViewCell实例

[QTable indexpatforcell: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;

 }

如果文本字段在文本视图单元格内,那么QCELL不应该只是[textField superview]?我测试了上面的示例,它没有work@wod有什么问题吗?对于iOS 8,如果textfield在单元内,则QCELL应该是[textfield superview],谢谢。我对那些if语句也有同样的问题。现在看起来这个IFU系统版本大于或等于_TO@8.0{…}如果系统版本大于或等于_TO@7.0{…}其中定义系统版本大于或等于[UIDevice currentDevice]系统版本]比较:v选项:NSNumericSearch]!=去嗅
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
{

    [self.delegate textFieldDidBeginEditingForCell:self];
    return true;
}
- (void)textFieldDidBeginEditingForCell:(YourCustomCell*)cell 
{
    NSIndexPath *path =  [QTable indexPathForCell:cell];

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

 }