2

我升级到 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 中不起作用。它也不会产生任何错误。

4

2 回答 2

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 是一个私有子类,它显然使向左滑动可以显示删除按钮

解决这个问题后,我发现这篇博文很好地说明了它

希望这能阻止你们中的一些人把头发拉出来:)

西蒙

于 2013-10-02T10:02:15.627 回答
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。

于 2014-02-11T21:14:14.337 回答