2012-05-09 51 views
5

我正在爲我的應用程序登錄屏幕,我想返回按鈕說「下一步」,當有一個字段,還沒有填寫,它應該說「去「當所有的字段被填充(我在談論UITextFields)。修改returnButton,同時編輯凍結鍵盤1輕拍

下面的代碼正常工作,它顯示了正確的時刻Next和Go。但是,無論何時從「下一步」更改爲「開始」,鍵盤上的下一次敲擊都將被忽略。當它顯示「Go」並且我通過退格清空文本字段時,沒有這樣的問題,並且它應該顯示Next。這幾乎就像舊鍵盤仍然存在,並在竊聽後消失。

我的問題是:這個問題的根源是什麼,更重要的是我該如何擺脫這種鍵盤凍結?

UITextField *theSender = (UITextField *)sender; 
if (allTextFieldsAreFilled) { 
    if (theSender.returnKeyType!=UIReturnKeyGo) { 
     theSender.returnKeyType = UIReturnKeyGo; 
     [theSender resignFirstResponder]; 
     [theSender becomeFirstResponder]; 
    } 
} else { 
    if (theSender.returnKeyType!=UIReturnKeyNext) { 
     theSender.returnKeyType = UIReturnKeyNext; 
     [theSender resignFirstResponder]; 
     [theSender becomeFirstResponder]; 
    } 
} 

此代碼被調用每三個UITextFields之一的值發生改變時,所以它是連接到編輯Changed事件的IBAction爲。

在此先感謝您的幫助!

編輯

我發現,如果文本字段設置爲安全(密碼),這隻會發生。當它沒有設置爲安全時,它不會凍結,我的代碼完美無缺!問題在於,當「安全」文本字段是第一響應者時,通常會發生對「Go」按鈕的更改。所以這不會改變任何問題。

回答

1

我創建了一個新的單一視圖應用程序項目測試了這一點;並放棄了下面的代碼ViewController.m

#import "ViewController.h" 

@interface ViewController() <UITextFieldDelegate> 
{ 
    @private 
    IBOutlet UITextField* m_fieldA; 
    IBOutlet UITextField* m_fieldB; 
    IBOutlet UITextField* m_fieldC; 
} 

@end 

@implementation ViewController 

// connected to Editing Did Begin 
- (IBAction) onFocus:(UITextField*)_textField 
{ 
    [self updateKeyboardFor:_textField]; 
} 

// connected to Editing Changed 
- (IBAction) onChanged:(UITextField*)_textField 
{ 
    [self updateKeyboardFor:_textField]; 
} 

- (void) updateKeyboardFor:(UITextField*)_textField 
{ 
    bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length]; 

    if (allTextFieldsAreFilled) 
    { 
     if (_textField.returnKeyType != UIReturnKeyGo) 
     { 
      _textField.returnKeyType = UIReturnKeyGo; 
      //[_textField resignFirstResponder]; 
      //[_textField becomeFirstResponder]; 
      [_textField reloadInputViews]; 
     } 
    } 
    else 
    { 
     if (_textField.returnKeyType != UIReturnKeyNext) 
     { 
      _textField.returnKeyType = UIReturnKeyNext; 
      //[_textField resignFirstResponder]; 
      //[_textField becomeFirstResponder]; 
      [_textField reloadInputViews]; 
     } 
    } 
} 

// A part of UITextFieldDelegate 
- (BOOL) textFieldShouldReturn:(UITextField*)_textField 
{ 
    if (_textField.returnKeyType == UIReturnKeyGo) 
    { 
     [_textField resignFirstResponder]; 

     // go off and perform 'go' 
    } 
    else 
    { 
     if(_textField == m_fieldA) [m_fieldB becomeFirstResponder]; 
     if(_textField == m_fieldB) [m_fieldC becomeFirstResponder]; 
     if(_textField == m_fieldC) [m_fieldA becomeFirstResponder]; 
    } 

    return true; 
} 

@end 

然後在XIB創建三個UITextFields,並迷上了,直到IBOutletsIBActions,並設置此視圖控制器作爲delegate的所有字段。

無論安全字段,所有似乎都正常工作。

我的猜測是,你的問題是在你移動到'下一個'字段的代碼中的某個地方;而不是在您發佈的代碼中。還要確保所有的網點和代表都正確連接。


更新:我已經編輯上面的代碼。註釋掉的線是問題,您應該使用reloadInputViews來更新按鈕。

看來它沒有鎖定鍵盤;但它所做的是在你鍵入第一個字母並做了辭職/成爲調用來刷新按鈕後,第二次按就會覆蓋第一個字母。這看起來像是iOS中的一個錯誤......如果在輸入空格的第一個字母后更明顯。當我注意到我添加了一個標籤,該標籤更新了密碼字段內容的內容,並且更清楚發生了什麼。

+0

很奇怪,我會檢查你的代碼。 – Manuel

+0

我複製了你的代碼,但它不會停止凍結。 – Manuel

+0

嗯;必須有別的東西。你使用的是什麼SDK,iOS和設備?你有沒有嘗試製作一個新項目來測試它?或者只是使用你當前的? – Wex