2011-07-07 30 views
10

Chạy này:Tại sao valueForKey: trên một UITextField ném một ngoại lệ cho các thuộc tính UITextInputTraits?

@try 
{ 
    NSLog(@"1. autocapitalizationType = %d", [self.textField autocapitalizationType]); 
    NSLog(@"2. autocapitalizationType = %@", [self.textField valueForKey:@"autocapitalizationType"]); 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"3. %@", exception); 
} 

Đầu ra này:

1. autocapitalizationType = 0 
3. [<UITextField 0x6c15df0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key autocapitalizationType. 

tôi đã mong đợi:

1. autocapitalizationType = 0 
2. autocapitalizationType = 0 

ngoại lệ này chỉ xảy ra với tính chất là một phần của giao thức UITextInputTraits. Các thuộc tính thông thường của một số UITextField như vậy có clearButtonMode có thể được truy cập thông qua valueForKey:.

Vậy tại sao bạn không thể truy cập UITextInputTraits các thuộc tính có mã hóa khóa-giá trị?

+0

Có thể do chi tiết triển khai. Bạn nên gửi một [báo cáo lỗi] (http://bugreport.apple.com) bằng Apple. –

Trả lời

4

Nếu bạn đi sâu vào khuôn khổ UIKit và mở ra UITextField.h, bạn sẽ tìm thấy:

@interface UITextField : UIControl <UITextInput, NSCoding> { 
    @private 

    UITextInputTraits *_traits; 
    UITextInputTraits *_nonAtomTraits; 

Bạn cũng sẽ thấy rằng clearButtonMode được khai báo là một @property trong file header UITextField, nhưng autocapitalizationType đó (và phần còn lại của giao thức UITextInputTraits) thì không.

Bạn và tôi không thấy được UITextField.m, vì vậy tất cả những gì chúng tôi thực sự có thể kết luận là Apple đã triển khai giao thức 's UITextInputTraits theo cách không tuân thủ KVC. Có lẽ mã keo ở đâu đó chuyển đổi [myTextField autocapitalizationType] thành giá trị thích hợp, nhưng bất kỳ ma thuật đằng sau hậu trường nào diễn ra đều dừng ngắn valueForKey:.

2

Đây là giải pháp thay thế của tôi: Tôi đã swizzled valueForKey: cho mỗi lớp thực hiện phương thức textInputTraits. Nếu khóa là một khóa UITextInputTraits, sau đó gọi valueForKey: trên đối tượng textInputTraits thay vì chính đối tượng đó.

Dưới đây là các chi tiết triển khai: 1, 23.

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