2011-10-14 18 views
4

對於我生命中過去幾個非常令人沮喪的日子,我一直在試圖弄清楚我的代碼有什麼問題。在某個頁面中,如果我放入UITextViewsUITextFieldsMFMailComposer或MessageComposer或任何帶有需要編輯的字段,則這些字段不會響應觸摸。我在運行應用程序時無法編輯任何內容。我無法編輯文本視圖或電子郵件字段或任何內容。我嘗試了一切,但沒有奏效。事實證明,在主頁(MainVC),導致頁面的字段不響應(GiftVC),在viewDidAppear方法(在MainVC),我說:[self becomeFirstResponder];爲什麼調用[self becomeFirstResponder]造成如此多的問題?

現在我不太確定爲什麼我把它放在那裏,但事實證明,評論該行可以修復所有內容,並使所有字段和文字視圖以及電子郵件作曲家和一切工作再次良好。

我也有這個在MainVC頁:

-(BOOL)canBecomeFirstResponder { 
    return YES; 
} 

,並評論說出來解決問題爲好。

奇怪的是,即使使用[self becomeFirstResponder]系列,在新的iOS 5(模擬器和設備)中一切正常,但在iOS 4(模擬器和設備)中,它根本無法使用該行。現在我已經刪除它,它在兩種情況下都可以正常工作。

回答

3

檢查MainVC是否有一個名爲canResignFirstResponder的方法返回NO(至少有時)。如果是這樣,那麼一旦它成爲第一響應者,它將不會讓其他任何人成爲第一響應者,直到它從該方法返回YES。 (所有的UITextViews等都必須成爲第一個被編輯的響應者)

實際上只是在canResignFirstResponder的所有代碼中查找,以防它在超類或其他類中。

否則唯一能阻止文本字段和視圖被編輯的東西可能是如果他們設置了userInteractionEnabled = NO,但由於它取決於becomeFirstResponder語句,所以它更可能用canResignFirstResponder來處理。

+0

沒有,在我的代碼沒有canResignFirstResponder的痕跡。但問題仍然存在 - 爲什麼這不是iOS 5中的問題,而是iOS 4中的問題? – Snowman

+0

什麼工作?如果答案沒有幫助解決您的問題,請不要將答案標記爲已接受。 – morningstar

2

在iOS 4中,子類必須覆蓋canBecomeFirstResponder才能成爲第一響應者。也許這對於iOS 5來說是不同的,或者它是一個錯誤。

4

如果你在你的UIViewController子類

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (self.view.window) { 
     [self becomeFirstResponder]; 
    } 
} 

,那麼你可能打算讓該子類來處理運動事件(晃動)或類似的東西以下。所以這可能就是爲什麼它在那裏。

如果您無法編輯UITextField,那麼此子類可能會成爲第一個響應者,而不會將事件轉發到實際的UITextField。當UIViewController子類調用覆蓋canBecomeFirstResponder返回YES並使它們成爲第一響應者(即[self becomeFirstResponder],如果您不想讓該自定義類處理UITextField的觸摸事件,那麼您應該覆蓋nextResponder方法。

從我自己的產品的一個例子 - 本質上我有一個UIViewController子類,它有兩件事:1)它處理搖動事件,2)當點擊某個按鈕時,它以模態方式顯示另一個視圖。在模態視圖上有一些UITextField s。爲了讓我UIViewController子類的觸摸事件轉發到我的模式的看法,我增加了以下內容:

- (UIResponder *)nextResponder 
{ 
    if (!self.view.window) { 
     // If the modal view is being displayed, forward events to it. 
     return self.modalViewController; 
    } else { 
     // Allow the superclass to handle event. 
     return [super nextResponder]; 
    } 
} 

這將在iOS 4和5的工作,無論是與SDK。

現在,在你的情況下,你顯然不記得添加代碼成爲第一響應者,所以你不需要上述的鉤子。然而,知道未來是很好的。

回到你的實際問題 - 一旦你將你的SDK更新到5,爲什麼不能在iOS 4上工作,但他們會在iOS 5上工作? iOS 5正在爲您做一些事件轉發,這就是爲什麼它在那裏工作。它應該從來沒有在iOS 4開始工作。蘋果公司修正了一些錯誤,允許它在4上工作,這就是爲什麼它不再適用於4.

我知道這個問題已經接受了接受的答案;我只是想澄清那裏的任何混亂。

+0

嗨...我最近用你的建議來覆蓋nextResponder,它工作得很好......除了一個問題。每當我從另一個模態中提出一個模態,它就會永遠循環。我有一個視圖,呈現這種模式的模式,用戶可以點擊一個按鈕來打開imagepicker。當點擊這個按鈕時,我將imagepicker呈現爲模態(模態內部的模態)。在這種情況下,nextResponder將永遠循環。我一直試圖自己解決這個問題,但無法弄清楚。有什麼建議麼? –

1

試試這個, 確保您已經添加了uiTextViewDelegate和

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{ 
    NSLog(@"textViewShouldBeginEditing:"); 
    return YES; 
} 
相關問題