为多个UITextFields分配第一个响应者
有一个应用程序,我在其中dynamic生成多个UITextFields
。 只要UITextFields
没有被选中(触摸UITextField
外部),我想要退出第一响应者。 我怎么能知道哪个UITextField
我不得不辞职急救员? 请指定“标签”概念以外的任何其他方式,因为我已经尝试过了。 请build议正确的方向。 提前致谢。
不要打电话给resignFirstResponder
; 来电endEditing:
调用endEditing:
在视图层次结构中的文本字段之上的任何视图。 它会find第一个响应者并要求它辞职。 使用endEditing:YES
来强制它或endEditing:NO
来让文本字段的委托来决定是否应该结束编辑(如果你正在validationinput,那么很有用)。
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view
使用此代码并执行
-(BOOL)textFieldShouldReturn:(UITextField*)textField; { NSInteger nextTag = textField.tag + 1; // Try to find next responder UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; if (nextResponder) { // Found next responder, so set it. [nextResponder becomeFirstResponder]; } else { // Not found, so remove keyboard. [textField resignFirstResponder]; } return NO; // We do not want UITextField to insert line-breaks. }
你可以实现委托方法
- (void)textFieldDidBeginEditing:(UITextField *)textField;
在那你可以把currentTextField = textField;
在另一个代表方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField;
你可以做currentTextField = nil;
你可以然后辞去currentTextField ….
你可以尝试这样的:
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { for (id textField in self.view.subviews) { if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) { [textField resignFirstResponder]; } } }
我没有尝试,但似乎是一个很好的解决scheme
在UITableViewController
中,最通用的方法也是唯一一个为我工作的方法是将响应发送到响应者链中,然后等待正确的对象接收该操作:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
在iOS8中testing
您可以将textFields
设置为属性并合成它们。 您将需要与您在应用程序中使用的许多属性。
你可以有@synthesise myTextField0, myTextField1, myTextField2;
为三个textFields。 只要将您正在使用的每个UITextField
分配给这些属性,同时声明它们。
而当你想要辞职的时候,只需在textFieldDidEndEditing
处使用[self.myTextField0 resignFirstResponder]
或者你想要辞职的函数。 你也可以使用这个用于其他的textFields。 这是处理多个textField的方法
通常,您可以跳过所有这些步骤,使用textField.returnKeyType = UIReturnKeyDone;
如果你有一个DONE
返回键,你可以去这个方法
- (BOOL) textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return 1; }
或者你可以使用tags
来标记某些文本字段,然后再退出特定的字段。
顺便说一句,我已经做了不同的方式..不看好相当好的编程冠军技术,但足以解决我的工作!
for(UIView *v in self.view.subviews) { if(([v isMemberOfClass:[UITextField class]]==YES) && !(CGRectContainsPoint(v.frame,[[touches anyObject] locationInView:self.View))) { v.userInteractionEnabled=NO; if([v isEditing]) { [v resignFirstResponder]; } } }
你可以检查isFirstResponder
。 在任何时间点,只有一个UIResponder
(你的情况下的UITextField
)可以是firstResonder
。
使用[self.view endEditing:YES];
resignFirstResponder为当前活动的UITextField。
这在Xamarin.iOS / Monotouch中适用于我。 将键盘button更改为下一步,将控件传递到下一个UITextField并在最后一个UITextField后隐藏键盘。
private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout ) { foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField))) { (item as UITextField).ReturnKeyType = UIReturnKeyType.Next; (item as UITextField).ShouldReturn += (textField) => { nint nextTag = textField.Tag + 1; var nextResponder = textField.Superview.ViewWithTag(nextTag); if (null != nextResponder) nextResponder.BecomeFirstResponder(); else textField.Superview.EndEditing(true); //You could also use textField.ResignFirstResponder(); but the above line makes some users happier (eg benzado) return false; // We do not want UITextField to insert line-breaks. }; } }
在ViewDidLoad中,你将拥有:
如果你的TextFields没有标签现在设置:
txtField1.Tag = 0; txtField2.Tag = 1; txtField3.Tag = 2; //...
和电话
SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList()); //If you are not sure of which view contains your fields you can also call it in a safer way: SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList()); //You can also reuse the same method with different containerViews in case your UITextField are under different views.
在从多个TextField中selectUITextField的Residenting first responder中遇到问题。 经过这么多不同的解决scheme之后,我发现这是为我工作的。
- (void)textFieldDidBeginEditing:(UITextField *)textField { for (id textField in self.view.subviews) { if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel] ) { [textField resignFirstResponder]; } } }
您可以使用endEditing
而不是resignFirstResponder
尝试这个
[self.view EndEditing:YES]