有一个应用程序,我在其中UITextFields
动态生成多个。UITextFields
每当未选择(触摸外部)时,我想辞去第一响应者的职务UITextField
。我怎么知道UITextField
我必须辞职的第一响应者?请指定“标签”概念之外的任何其他方式,因为我已经尝试过了。请提出正确的方向。提前致谢。
13 回答
不要打电话resignFirstResponder
;打电话endEditing:
!
调用endEditing:
视图层次结构中文本字段上方的任何视图。它将找到第一响应者并要求其辞职。用于endEditing:YES
强制它或endEditing:NO
让文本字段的委托决定是否应该结束编辑(如果您正在验证输入,则很有用)。
**[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];
}
}
}
我没有尝试,但它似乎是一个很好的解决方案
最通用的方法也是唯一对我有用的方法UITableViewController
是将动作发送到响应者链并等待正确的对象接收动作:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
在 iOS8 中测试
您可以设置textFields
为属性并合成它们。您将需要在您的应用程序中使用的尽可能多的属性。
您可以拥有 @synthesise myTextField0, myTextField1, myTextField2;
三个文本字段。只需将UITextField
您正在使用的每个属性分配给这些属性,同时声明它们。
当您想辞退他们时,只需使用[self.myTextField0 resignFirstResponder]
attextFieldDidEndEditing
或您想要辞退他们的任何功能。您也可以将其用于其他文本字段。这是处理多个文本字段的方法
一般来说,你可以跳过所有这些步骤,textField.returnKeyType = UIReturnKeyDone;
如果你有DONE
返回键,你可以直接去方法
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return 1;
}
或者您可以使用tags
标记某些文本字段,然后辞去特定的文本字段。
你可以检查一下isFirstResponder
。在任何时候,只有一个UIResponder
(UITextField
在你的情况下)可以是firstResonder
.
顺便说一句..我以不同的方式做到了这一点.. 看起来不是一个很好的编程冠军技术,但足以解决我的工作!
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];
}
}
}
[self.view endEditing:YES];
用于为当前活动的 UITextField 重新分配FirstResponder 。
我在从多个 TextField 中为选定的 UITextField辞职第一响应者时遇到问题。经过这么多不同的解决方案,我发现这对我有用。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
for (id textField in self.view.subviews) {
if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel] ) {
[textField resignFirstResponder];
}
}
}
这在 Xamarin.iOS / Monotouch 中对我有用。将键盘按钮更改为 Next,将控件传递给下一个 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 (e.g. 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.
您可以使用endEditing
而不是resignFirstResponder
尝试这个
[self.view EndEditing:YES]