我正在使用带有自定义单元格的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
如您所见,我的桌面视图太大,当到达底部时滚动条卡在视图中间。
对不起我的英语,我希望你能理解我,
提前致谢!
汉斯
答案 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。