tableView在自定义uitableViewCell中的textField resignFirstResponder之后的frame.origin问题

时间:2009-08-20 22:08:08

标签: iphone objective-c uitableview

我正在使用带有自定义单元格的tableView。当我想使用navigationController的pushViewController函数显示另一个视图时,我遍历文本字段并在它们上面调用resignFirstResponder。但resignFirstResponder仅在显示文本字段时才起作用,因此我首先滚动到页面顶部。这是代码:

NSIndexPath *topIndexPath;
topIndexPath = [[NSIndexPath indexPathWithIndex:0] indexPathByAddingIndex:0];
[self.tableView scrollToRowAtIndexPath:topIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

[[self textFieldForRow:0] resignFirstResponder];
[[self textFieldForRow:1] resignFirstResponder];
[[self textFieldForRow:2] resignFirstResponder];
[[self textFieldForRow:3] resignFirstResponder];

这样可行,但在此之后我的tableView出现了一些奇怪的问题。我试图将它的超级视图原点设置为0,但这没有帮助。

以下是问题的屏幕截图:link

如您所见,我的桌面视图太大,当到达底部时滚动条卡在视图中间。

对不起我的英语,我希望你能理解我,

提前致谢!

汉斯

2 个答案:

答案 0 :(得分:2)

实际上非常简单。只需将您的resignFirstResponder放入-viewWillDisappear

即可

编辑:这是更好,更少hacky,我把它添加到我的班级,它工作:

编辑2:使用上一代码时,您的应用似乎会被拒绝。这是更新的公共API版本:

- (void)viewWillDisappear:(BOOL)animated
{
    [self.view findAndResignFirstResponder];
}

@implementation UIView (FindAndResignFirstResponder)
- (BOOL)findAndResignFirstResponder
{
    if (self.isFirstResponder) {
        [self resignFirstResponder];
        return YES;     
    }
    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder])
            return YES;
    }
    return NO;
}
@end

(来源:Get the current first responder without using a private API

答案 1 :(得分:0)

我会解决你的另一个问题。我想当你说当其他textFields在屏幕上时你不能调用“resignFirstResponder”时,你的意思是发生了崩溃?

如果是这样,那是因为屏幕单元格不存在,因此文本字段也消失了。它们被回收利用(因此它们可以为新细胞出列)。

简单的解决方案是仅在屏幕上的textFields上调用resignFirstResponder。

你现在正在做的事情看起来有点像hacky。