2011-07-14 65 views
12

有一個應用程序,我在其中動態生成多個UITextFields。只要沒有選擇UITextFields(在UITextField之外觸摸),我想要退出第一響應者。我如何知道哪一個UITextField我不得不辭職急救員?請指定「標籤」概念以外的任何其他方式,因爲我已經嘗試過。請提出正確的方向。提前致謝。退出多個UITextField的第一個響應者

+0

可能重複(http://stackoverflow.com/questions/741185/easy-way-to-dismiss-keyboard) – Loukas

回答

0

您可以將textFields設置爲屬性並進行合成。您將需要與您在應用程序中使用的屬性一樣多。

對於三個textField,您可以有@synthesise myTextField0, myTextField1, myTextField2;。只需將您正在使用的每個UITextField分配給這些屬性,同時聲明它們。

而當你想辭職時,只需使用[self.myTextField0 resignFirstResponder]textFieldDidEndEditing或你想要辭職的功能。你也可以使用它來處理其他的textField。這是處理多個文本框

一般的方式,你可以跳過這些步驟,textField.returnKeyType = UIReturnKeyDone; 如果你有一個DONE返回鍵,你可以去到方法

- (BOOL) textFieldShouldReturn:(UITextField *)textField 
{ 
[textField resignFirstResponder]; 
return 1; 
} 

,或者您可以使用tags來標記某些文本字段,然後退出特定的字段。

+0

感謝響應,但此事發生的動態UITextField無法知道有多少人會在那裏?所以也不能合成,所以事情... 雖然做了不同的方式!謝謝!! –

3

使用此代碼並執行

-(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. 
} 
+0

感謝@Deepesh快速回復! –

3

您可以實現的委託方法

- (void)textFieldDidBeginEditing:(UITextField *)textField; 

你可以採取currentTextField =文本框;

在另一個委託方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField; 

你可以做currentTextField =零;

那麼你可以辭職currentTextField ....

+0

+1這麼簡單和真實的答案。 –

+0

@Jennis:謝謝:) – iMOBDEV

+0

@Jignesh感謝您的快速和簡單的迴應!我已經完成了! –

0

你可以檢查與isFirstResponder。 在任何時間點只有一個UIResponderUITextField在你的情況)可以是。

+0

感謝您的建議!我用其他方式完成了它,但想知道你的完整過程..你能發佈一段代碼嗎?提前致謝!! –

0

順便說一下..我用不同的方式做了這個..不是看起來不錯的編程冠軍技術,但足以解決我的工作!

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]; 
       } 
      } 
    } 
3

,您可以嘗試這樣的:

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event { 

    for (id textField in self.view.subviews) { 

     if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) { 
      [textField resignFirstResponder]; 
     } 
    } 
} 

我沒有嘗試,但它似乎是一個不錯的解決方案

49

不要叫resignFirstResponder;致電endEditing:

在視圖層次結構中的文本字段之上的任何視圖上調用endEditing:。它會找到第一個響應者並要求它辭職。使用endEditing:YES強制它或endEditing:NO讓文本字段的委託人決定是否應該結束編輯(如果您正在驗證輸入,則有用)。

8
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view 
-1

您可以使用endEditing代替resignFirstResponder

嘗試這個

[self.view EndEditing:YES] 
+0

已經給出了相同的答案 – Loukas

0

使用[self.view endEditing:YES];以resignFirstResponder當前活動的UITextField。

1

最通用的方法,也只有在UITableViewController工作對我來說是一個被向下發送響應鏈的行動,並等待合適的對象接收動作:

[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];

測試在iOS8中

0

這在Xamarin.iOS/Monotouch中適用於我。 將鍵盤按鈕更改爲下一步,將控件傳遞到下一個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. 
0

我在有問題辭職第一響應者用於從多個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]; 
     } 
    } 
} 
的[簡單的方法來關閉鍵盤?]
相關問題