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