2010-09-02 66 views
4

我不斷看到手動遍歷UIView中某個類型的所有子視圖的示例。例如,如果你想有一個鍵盤之外的點擊取消鍵盤無論哪個字段處於活動狀態,可能會:獲取UIView類型

-(IBAction)backgroundClick:(id)sender 
{ 
    [myTextField resignFirstResponder]; 
    [myOtherTextField resignFirstResponder]; 
    // ... repeat for each of my zillion text fields. 
} 

取而代之的是這樣的:

for(UIView *v in self.view.subviews) 
    if(v.hasKeyboard) // or something like java's instanceof 
     [v resignFirstResponder]; 

雖然改進的具體(例如現在發現哪一個是第一響應者),我對此表示讚賞,我對一般情況更感興趣。

回答

6

你不能這樣做

if([v isMemberOfClass:[UITextField class]]){
[v resignFirstResponder];
}

+2

謝謝!我可以在幾個地方使用它!對於文本字段編輯的特定情況,我最終還發現你可以[self.view endEditing:YES]而不是迭代。 – 2010-09-02 14:10:41

2

或者,您可以通過迭代意見與

if([v respondsToSelector:@selector(isFirstResponder)] && [v isFirstResponder]) 
{ 
    [v resignFirstResponder]; 
    break; 
} 

這樣只會調用resignFirstResponder對當前第一個響應並在當前的第一響應者被發現將停止。它將在UITextFields,UITextViews等以及任何未來的文本編輯視圖上工作(假設它們繼續實現響應方法)。

對於更一般的情況下,你可以使用

if([v isKindOfClass:UITextField.class]) 
{ 
    [v resignFirstResponder]; 
} 

對於一般鍵盤解僱首先是首選,因爲所有你感興趣的是鍵盤。該對象聲稱它將處理消息(方法調用),所以您不必真正關心它是什麼類型。如果你確實需要確定它是一個UITextField,那麼第二個選項是首選。