2012-05-09 33 views
5

Tôi đang tạo màn hình đăng nhập cho ứng dụng của mình và tôi muốn nút quay lại hiển thị "Tiếp theo" khi có trường chưa được điền và có thể nói "Đi "khi tất cả các trường được điền (tôi đang nói về UITextFields).Thay đổi returnButton trong khi chỉnh sửa đóng băng bàn phím cho 1 tap

Mã bên dưới hoạt động tốt ở chỗ nó hiển thị Tiếp theo và Chuyển đến đúng thời điểm. Nhưng bất cứ khi nào nó thay đổi từ "Next" thành "Go", lần nhấn tiếp theo trên bàn phím sẽ bị bỏ qua. Khi nó nói "Go" và tôi làm rỗng các textfield bằng backspacing không có vấn đề như vậy và nó cho thấy tiếp theo như nó cần. Nó gần giống như bàn phím cũ vẫn còn đó và biến mất sau khi được khai thác.

Câu hỏi của tôi là: nguồn gốc của vấn đề này là gì và quan trọng hơn là làm cách nào để loại bỏ phần đóng băng này?

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

Mã này được gọi mỗi khi giá trị của một trong ba UITextField được thay đổi, do đó, IBAction được kết nối với sự kiện Chỉnh sửa đã thay đổi.

Cảm ơn trước sự giúp đỡ của bạn!

EDIT

tôi phát hiện ra điều này sẽ chỉ xảy ra nếu các textfield được thiết lập để bảo đảm (mật khẩu). Khi nó không được thiết lập để bảo mật nó sẽ không đóng băng và mã của tôi hoạt động hoàn hảo! Vấn đề là sự thay đổi nút "Go" thường sẽ xảy ra khi một trường văn bản 'an toàn' là nắm tay trả lời. Vì vậy, điều này không thay đổi bất cứ điều gì cho vấn đề.

Trả lời

1

Tôi đã tạo một dự án Single View Application mới để kiểm tra điều này; và giảm các mã sau trong 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 

Sau đó, trong XIB tạo ba UITextFields và nối họ lên các IBOutlets, IBActions, và cũng có thể thiết lập bộ điều khiển quan điểm này như delegate cho tất cả các lĩnh vực.

Tất cả dường như hoạt động tốt bất kể trường bảo mật.

Tôi đoán là sự cố của bạn ở đâu đó trong mã mà bạn chuyển sang trường 'Tiếp theo'; và không có trong mã mà bạn đã đăng. Ngoài ra hãy chắc chắn rằng tất cả các cửa hàng và đại biểu của bạn được liên kết đúng cách.


Cập nhật: Tôi đã chỉnh sửa đoạn mã trên. Các nhận xét ra dòng là vấn đề, bạn nên sử dụng reloadInputViews để cập nhật các nút.

Dường như nó không khóa bàn phím; nhưng những gì nó đã làm là sau khi bạn gõ chữ cái đầu tiên và đã làm từ chức/trở thành cuộc gọi để làm mới nút sau đó nhấn lần thứ hai sẽ ghi đè lên đầu tiên. Điều này có vẻ giống như một lỗi trong iOS ... nó đáng chú ý hơn nếu sau khi chữ cái đầu tiên bạn gõ một không gian. Khi tôi nhận thấy rằng tôi đã thêm một nhãn cập nhật nội dung của nó với nội dung của trường mật khẩu và thậm chí còn rõ ràng hơn những gì đang diễn ra.

+0

Thật lạ lùng, tôi sẽ kiểm tra mã của tôi với mã của bạn. – Manuel

+0

Tôi đã sao chép mã của bạn nhưng mã sẽ không ngừng đóng băng. – Manuel

+0

Hmm; phải có cái gì đó khác. Bạn đang sử dụng SDK, iOS và thiết bị nào? Bạn đã thử tạo một dự án mới để thử nghiệm nó chưa? Hoặc chỉ sử dụng cái hiện tại của bạn? – Wex

Các vấn đề liên quan