2012-05-15 19 views
5

Tôi có một NSTextField ràng buộc với mô hình của tôi. Nếu tôi thay đổi nội dung của trường văn bản theo lập trình, mô hình không được cập nhật. Tôi biết rằng bạn được cho là update the model instead.Với Cocoa Bindings, thay đổi giá trị của NSTextField theo lập trình không cập nhật mô hình

Nhưng tôi đang cố gắng triển khai lớp con NSTextField nhận ra cuộn khi chuột di chuột qua nó để thay đổi giá trị bằng số. Rõ ràng là tôi không có quyền truy cập vào mô hình từ lớp con này. Vì vậy, bạn có bất cứ đề nghị làm thế nào tôi có thể làm điều này?

SOLUTION (nhờ noa):

- (void)scrollWheel:(NSEvent *)theEvent { 
    [self setFloatValue:[self floatValue] - [theEvent deltaY]]; 
    NSDictionary *bindingInfo = [self infoForBinding: NSValueBinding]; 
    NSObject *boundObject = [bindingInfo valueForKey:NSObservedObjectKey]; 
    NSString *keyPath = [bindingInfo valueForKey:NSObservedKeyPathKey]; 
    [boundObject setValue:[NSNumber numberWithFloat:[self floatValue]] 
       forKeyPath:keyPath]; 
} 

Trả lời

6

Bạn có thể hoặc là sử dụng mục tiêu hành động hoặc Cocoa Bindings:

  1. Target-action: kết nối chọn hành động của trường text cho một số updateValue hành động của bộ điều khiển. Sau đó, trong trường văn bản, hãy gọi bộ chọn sau khi bạn thay đổi giá trị của trường văn bản. Hành động sẽ tìm nạp giá trị của trường văn bản và truyền nó tới mô hình.

  2. Bindings Cocoa: Đặt giá trị ràng buộc Giá trị của trường văn bản thành thuộc tính tuân thủ KVO của đối tượng mô hình. Sau đó, bạn có thể cập nhật giá trị của ô và trình kết nối sẽ cập nhật đối tượng mô hình cho bạn.

Lợi thế của các thiết kế đặc biệt này là việc ghép nối giữa trường văn bản và thuộc tính mô hình được xử lý với ràng buộc hoặc mục tiêu. Nếu bạn muốn sử dụng trường văn bản cho thuộc tính khác, bạn chỉ có thể sử dụng một hành động khác hoặc một ràng buộc khác, mà không sửa đổi mã trường văn bản tùy chỉnh.

Tôi có thể sử dụng các ràng buộc, bản thân mình, mà tôi cho là ít hoạt động hơn, nhưng hành động mục tiêu cũng hoàn toàn ổn và một chút đơn giản hơn.


Thật vậy, bạn đã nói "bị ràng buộc". Tôi nghĩ các thay đổi có lập trình đối với trường văn bản đã kích hoạt bản cập nhật, nhưng vì không phải như vậy, bạn có thể tự cập nhật giá trị ràng buộc. Dưới đây là một số mã bạn có thể thử:

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding]; 
[[bindingInfo valueForKey:NSObservedObjectKey] setValue:self.integerValue 
              forKeyPath:[bindingInfo valueForKey:NSObservedKeyPathKey]]; 
+0

Như tôi đã nói, tôi đang sử dụng các ràng buộc. Giá trị của trường văn bản của tôi bị ràng buộc với thuộc tính tuân thủ KVO của đối tượng mô hình của tôi. Vấn đề của tôi là, ràng buộc chỉ cập nhật thuộc tính của đối tượng mô hình khi tôi thay đổi giá trị của trường văn bản bằng tay, nhưng không phải khi nó thay đổi theo chương trình. – DrummerB

+0

Lỗi của tôi, tôi nghĩ các cập nhật có lập trình cho các điều khiển bị ràng buộc đã cập nhật mô hình. Tôi sẽ tìm một số mã để đăng. – paulmelnikow

+0

Thật không may đó không phải là trường hợp. Cảm ơn bạn đã cố gắng để giúp đỡ! – DrummerB

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