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でテスト済み
ところで..私はこれを別の方法で行いました..プログラミングのチャンプ技術はあまり良くありませんが、私の仕事を解決するのに十分です!!
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 の ResignFirstResponder に使用します。
プロパティとして設定textFields
し、合成することができます。アプリで使用しているのと同じ数のプロパティが必要になります。
@synthesise myTextField0, myTextField1, myTextField2;
3 つの textFieldsを持つことができます 。UITextField
それらを宣言しながら、使用しているそれぞれをこれらのプロパティに割り当てるだけです。
そして、それらを辞任したいときは、[self.myTextField0 resignFirstResponder]
attextFieldDidEndEditing
または辞任したい関数を使用してください。また、これを他の textFields にも使用できます。これは、複数の textFields を処理する方法です
通常、これらの手順はすべてスキップできます。リターン キーtextField.returnKeyType = UIReturnKeyDone;
があれば、メソッドに移動できます。DONE
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return 1;
}
tags
または、特定の textField にタグを付けてから、特定のものを辞任するために使用できます。
で確認できますisFirstResponder
。いつでもUIResponder
(UITextField
あなたの場合は)1つだけができますfirstResonder
。
これは、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内には、次のものがあります。
TextField にタグが設定されていない場合:
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.