scrollToRowAtIndexPath在iOS 7中停止工作 - ?UITableViewCellScrollView?更改UITableViewCell层次结构

时间:2013-10-02 10:02:16

标签: uitableview ios7

我升级到Xcode 5和我的应用程序以iOS 7为目标,我的应用程序不再响应scrollToIndexPath来滚动适当的tableviewcell而不是键盘

我的设置是我有一个自定义的tableview单元格,上面有文本字段,并用它来生成多个tableview单元格来显示和编辑地址的一部分。

点击单元格上的文本字段会触发

- (void)textFieldDidBeginEditing:(UITextField *)textField

使其滚动到顶部的代码,不受键盘影响如下

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview;
[self scrollToRowAtIndexPath:[self indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];

这在iOS 6中运行良好,但在iOS 7中不起作用。它也不会产生任何错误。

2 个答案:

答案 0 :(得分:5)

这里的解决方案很简单

似乎tableviewCells的层次结构发生了变化

所以添加额外的.superview

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview;

变为

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview.superview;

它的目标是iOS 7。

textField.superview.superview曾经是UITableViewCell类的对象(或者更具体地说是我的自定义UITableViewCell)

现在它是UITableViewCellScrollView类的一个对象,你需要得到它的超级视图。

UITableViewCellScrollView是一个私有子类,显然允许向左滑动显示删除按钮

After working this out i found this blogpost which illustrates it nicely

希望这能阻止你们中的一些人拔头发。)

西蒙

答案 1 :(得分:2)

正如之前的回答所说,UITableViewCell的视图层次结构在iOS 7中发生了变化。而不是使用:

UITableViewCell *cell = (UITableViewCell*) textField.superview.superview;

定义以下方法:

- (UITableViewCell *)cellForSubview:(UIView *)subview
{
    UIView *view = subview;
    while (view != nil && ![view isKindOfClass:[UITableViewCell class]]) {
        view = [view superview];
    }
    return view;
}

然后按如下方式使用:

UITableViewCell *cell = [self cellForSubview:textField];

这应该适用于iOS 6和7。