UITextField 不辞职第一响应者?
Posted
技术标签:
【中文标题】UITextField 不辞职第一响应者?【英文标题】:UITextField not resigning first responder? 【发布时间】:2011-12-12 19:38:30 【问题描述】:我将视图控制器呈现为模态。这个视图控制器有几个通过 IB 连接的 UITextFields。
我的问题是当按下返回键时,委托方法被调用,但由于某种原因,在给定的 textField 上调用 resignFirstResponder 不是。即使我在 textFieldShouldReturn 委托方法中向控制台打印一条消息,它也会被打印出来,但它只会拒绝调用 resign 方法。
在 shouldReturn 委托方法中我只有:
-(BOOL)textFieldShouldReturn:(UITextField *)textField
[textField resignFirstResponder];
return YES;
这真的从来没有发生在我身上,它只是不会resignFirstResponder。正如我之前提到的,我可以向控制台打印,只是为了验证 shouldReturn 方法是否被调用。
我也试过这个只是为了看看是否设置了委托,它确实改变了 UITextField 的行为。
-(void)textFieldDidBeginEditing:(UITextField *)textField
[textField setTextAlignment:UITextAlignmentCenter];
这个问题真的让我很困惑。即使我尝试直接在文本字段上调用 resignFirstResponder,它也不会关闭键盘。
-(BOOL)textFieldShouldReturn:(UITextField *)textField
if ([textField isEqual:self.productTextField])
NSLog(@"Product textfield");
[self.productTextField resignFirstResponder];
else if ([textField isEqual:self.quantityTextField])
NSLog(@"Quantity textfield");
return YES;
两个日志都使用各自的文本字段,并分别打印相应的消息。但是在直接向文本字段发送消息时调用该方法仍然没有任何作用。
找到了答案,显然,UIPresentationFormSheet 不允许你摆脱键盘。我尝试了不同的演示风格,它奏效了。 @Cal,感谢您的question。
【问题讨论】:
您可能只想在这里使用textField == self.productTextField
而不是[textField isEqual:self.productTextField]
(同样适用于其他)。要么你有对同一个实例的引用,要么你没有......当你处理在当前控制器范围内一次只存在一个的实例时,平等并不意味着什么。
我会在设置时为所有文本字段分配标签,并添加标签检查而不是 [textField isEqual:self.productTextField]
【参考方案1】:
我认为您需要在 textFieldShouldReturn 方法中明确写入 [textField resignFirstResponder];
。
如果你已经这样做了,也许这肯定很奇怪。你可以发布你的代码吗? :)
【讨论】:
我希望它这么简单。调用了委托方法,但文本字段不会 resignFirstResponder。 我想到的 3 个其他想法: 1/ 它真的是您正在使用的 UITextField,而不是重新实现 resignFirstResponder 而不调用 super 的子类吗? 2/ 你的视图控制器中有一个名为 textField 的属性吗? 3/ 如果你在你正在使用的两个文本字段上调用 resignFirstResponder 怎么办? 感谢您的帮助。回答你的想法,对所有三个都没有。然而,我确实找到了答案。请查看我编辑的问题。以上是关于UITextField 不辞职第一响应者?的主要内容,如果未能解决你的问题,请参考以下文章
UITextField,辞职第一响应者时,导致文本的奇怪动画滚动
Swift 如何让所有 uiTextfield 上的第一响应者辞职
使用 UIToolbar/UITextField 辞职第一响应者问题