2011-12-27 25 views
11

Mặc dù tôi đã tìm kiếm nhiều thông tin về Cocoa Bindings, tôi vẫn tương đối không hài lòng với thông tin mà tôi có và đã nhận được. Dường như chủ đề đó hơi rắc rối đối với nhiều người và nhiều người chỉ tránh né mô hình này, điều mà tôi tin là không nên.Tại sao sử dụng NSObjectController

Tất nhiên, nó có vẻ rằng ràng buộc đôi khi quá phức tạp hoặc có lẽ được thiết kế với quá nhiều chi phí ...

Tuy nhiên, tôi có một câu hỏi rất trực tiếp và cụ thể: Tại sao NSObjectController cần thiết nếu tôi có thể thiết lập các ràng buộc trực tiếp?

Ví dụ, mã:

[controller bind:@"contentObject" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

[slicesTextField bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 
[stepperControl bind:@"value" toObject:controller withKeyPath:@"content" options:nil]; 

Liệu chính xác giống như:

[slicesTextField bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 
    [stepperControl bind:@"value" toObject:self withKeyPath:@"numberOfPieSlices" options:nil]; 

Trong trường hợp của tôi ở đây, chúng ta đang nói về tài sản của lớp bên trong đó tất cả mọi thứ đang xảy ra, vì vậy Tôi đoán nhu cầu về NSObjectController là khi nào:

  • đường dẫn chính cho bộ điều khiển là đối tượng và ràng buộc các điều khiển khác là cần thiết đối với các thuộc tính của nó, không phải giá trị của nó như với các giá trị nguyên thủy và hàm bao quanh chúng là trường hợp (numberOfPiesSlices trong trường hợp của tôi là NSInteger). giữa các đối tượng trong một số

Ai đó có thể xác nhận hoặc từ chối điều này không?

Trả lời

8

Một trong những lợi ích/điểm của các ràng buộc là loại bỏ mã. Để kết thúc, NSObjectController vv có lợi ích mà chúng có thể được sử dụng trực tiếp trong trình xây dựng giao diện và thiết lập với các ràng buộc với các phần tử giao diện người dùng khác nhau.

Các ràng buộc chỉ thể hiện một phần chức năng được cung cấp. Các lớp * ObjectController cũng có thể tự động xử lý rất nhiều bộ điều khiển lặp đi lặp lại khác (như trong Model, View, Controller) mà một ứng dụng thường cần. Ví dụ họ có thể:

  • kết nối lưu trữ dữ liệu cốt lõi của bạn và thực hiện các fetches cần thiết, chèn và xóa
  • quản lý undo/redo chồng
  • Pick up chỉnh sửa nhưng không thay đổi cam kết UI của bạn và tiết kiệm chúng (ví dụ: nếu cửa sổ đóng trong khi tiêu điểm vẫn nằm trên trường văn bản đã chỉnh sửa - đây là một trường mới đối với tôi, tôi đã tìm thấy nó từ câu trả lời của mmalc trong chuỗi bên dưới).

Nếu bạn không thực hiện việc này, thì có thể không phải là giá trị sử dụng NSObjectController. Các lớp con của nó (NSArrayController vv) hữu ích hơn.

Cũng xem here để thảo luận về câu hỏi chính xác của bạn!

+1

Các thành phần của giao diện người dùng có thể bị ràng buộc với bộ điều khiển đối tượng hoặc một thứ khác, như được nói trong câu hỏi. Vậy một bộ điều khiển đối tượng sẽ loại bỏ mã nào? –

+0

Mã nơi bạn thiết lập ràng buộc ở vị trí đầu tiên - bạn có thể làm điều này trong IB với NSObjectController. Trừ khi tôi nhầm lẫn và bạn có thể thiết lập các ràng buộc trong IB với các đối tượng điều khiển không *? Hạnh phúc để được sửa chữa nếu có. – jrturton

+1

Bạn không thể thiết lập một ràng buộc trên một đối tượng đơn giản trong IB hoặc trình soạn thảo nib, nhưng bạn có thể liên kết * với * một đối tượng đơn giản. Mục đích là gì để tạo ra một bộ điều khiển đối tượng khác ngoài việc liên kết với nó - và nếu không, tại sao không ràng buộc điều khiển trực tiếp với đối tượng mà nó cần sao lưu nó? –

4

Tại sao NSObjectController cần thiết nếu tôi có thể thiết lập liên kết trực tiếp?

tôi đọc câu hỏi này một vài ngày trước khi tìm kiếm một số thông tin về NSObjectController, và ngày nay trong khi tiếp tục tìm kiếm của tôi, tôi thấy the following passage mà dường như có liên quan đến câu hỏi:

Có những lợi ích nếu đối tượng bị ràng buộc để triển khai NSEditorRegistration. Đây là một trong những lý do tại sao bạn nên ràng buộc để điều khiển các đối tượng thay vì liên kết trực tiếp với mô hình. NSEditorRegistration cho phép ràng buộc cho bộ điều khiển biết rằng nội dung đang trong quá trình chỉnh sửa. Bộ điều khiển theo dõi trong đó chế độ xem hiện đang chỉnh sửa nội dung của bộ điều khiển. Nếu người dùng đóng cửa sổ, ví dụ: mọi bộ điều khiển được liên kết với cửa sổ đó có thể yêu cầu tất cả các chế độ xem đó ngay lập tức cam kết chỉnh sửa đang chờ xử lý của họ và do đó người dùng sẽ không mất bất kỳ dữ liệu nào. Apple cung cấp một số đối tượng điều khiển chung (NSObjectController, NSArrayController, NSTreeController) có thể được sử dụng để bọc các đối tượng mô hình của bạn, cung cấp chức năng đăng ký trình chỉnh sửa.

Sử dụng một bộ điều khiển cũng có lợi thế là hệ thống ràng buộc là không trực tiếp quan sát đối tượng mô hình của bạn - vì vậy nếu bạn thay thế đối tượng mô hình của bạn với một cái mới (chẳng hạn như trong một cái nhìn chi tiết mà người dùng có thay đổi bản ghi đang được kiểm tra), bạn chỉ có thể thay thế đối tượng mô hình bên trong bộ điều khiển, thông báo KVO và các bản cập nhật ràng buộc .