我有一个自定义UITableViewCell
,其中包含UITextField
。使用 iOS 7 目标运行应用并点击单元格中的UITextField
时,didSelectRowAtIndexPath
会触发,但indexPath
为nil
。当我在 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;
答案 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>>