【问题标题】:scrollToRowAtIndexPath stopped working in iOS 7 - ?UITableViewCellScrollView? Change in UITableViewCell hierarchyscrollToRowAtIndexPath 在 iOS 7 中停止工作 - ?UITableViewCellScrollView? UITableViewCell 层次结构的变化
【发布时间】:2014-02-12 05:14:14
【问题描述】:

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

【问题讨论】:

    标签: uitableview ios7


    【解决方案1】:

    这里的解决方案很简单

    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

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

    西蒙

    【讨论】:

    • 向后兼容性怎么样?
    • 就我自己而言,我决定忘记 iOS6 而只针对 iOS7 - 它是一个尚未推出的新应用程序,但我确信稍加反省就会揭示我们使用的是哪个版本的 iOS 和你可以 if (){} else{} 解决这个问题
    • 查看下面更好的解决方案,因为这在 iOS 8 下再次中断。Eric 的解决方案将继续工作 - 更加优雅
    【解决方案2】:

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

    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。

    【讨论】:

    • 比我的好多了 - 我的在 iOS8 中会再次坏掉 :)
    • 它确实做到了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多