单击单元格中的UITextField时,对于DidSelectRowAtIndexPath,indexPath为nil

时间:2014-04-30 19:07:33

标签: objective-c

我有一个自定义UITableViewCell,其中包含UITextField。使用 iOS 7 目标运行应用并点击单元格中的UITextField时,didSelectRowAtIndexPath会触发,但indexPathnil 。当我在 iOS 6.1 模拟器中运行相同的代码时,indexPath不是nil

我的第一个问题是"为什么会改变?"

我的第二个问题是"什么是获取活动indexPath行的最佳方式" ,因为我无法使用didSelectRowAtIndexPath获取它了吗?

以下代码有效,但感觉 hack-ish

-(UITableViewCell *) cellFromEdit: (UITextField *) field {
    UIView *view = field.superview;
    while (view) {
        if ([view isKindOfClass:[UITableViewCell class]])
            return (UITableViewCell *) view;
        view = view.superview;
    }
    return nil;
}

- (void)textFieldDidChange:(UITextField *)theTextField {
    UITableViewCell *cell = [self cellFromEdit:theTextField];
    if (!cell)
        return;
    int row = [tableView indexPathForCell:cell].row;

1 个答案:

答案 0 :(得分:0)

使用与this类似的方法,您可以获取单元格中UITextField的索引路径:

-(NSIndexPath *)indexPathForTextField:(UITextField *)textField
{
    CGPoint textFieldMiddle = CGPointMake(CGRectGetMidX(textField.bounds), CGRectGetMidY(textField.bounds));
    CGPoint point = [textField convertPoint:textFieldMiddle toView:self.tableView];
    return [self.tableView indexPathForRowAtPoint:point];
}

-(void)textFieldDidChange:(UITextField *)textField
{
    NSIndexPath *indexPath = [self indexPathForTextField:textField];
    // Now you can update the object at indexPath for your model!
}

这比依赖tag或查看superview s还要整洁!

回答“为什么会改变?”问题......

iOS 7 UITableViewCell层次结构不同,因为它现在包含滚动视图或单元格内的某些内容来处理要删除的滑动。

这是iOS 7中视图层次结构的转储:

<CustomTableViewCell: 0x8cbc9e0; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize = W; layer = <CALayer: 0x8cbcc50>>
   | <UITableViewCellScrollView: 0x8c6ceb0; frame = (0 0; 320 44); autoresize = W+H; gestureRecognizers = <NSArray: 0x8c6d0c0>; layer = <CALayer: 0x8cbce50>; contentOffset: {0, 0}>
   |    | <UITableViewCellContentView: 0x8cb54e0; frame = (0 0; 320 44); gestureRecognizers = <NSArray: 0x8cbb990>; layer = <CALayer: 0x8cbb7f0>>
   |    |    | <UILabel: 0x8cbbaf0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x8cbd000>>
   |    |    | <UITableViewLabel: 0x8cbd210; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x8cbd360>>
   |    | <_UITableViewCellSeparatorView: 0x8cc2a10; frame = (15 43.5; 305 0.5); layer = <CALayer: 0x8cc26e0>>