Tôi có một ứng dụng có bộ điều khiển chế độ xem gốc, bộ điều khiển chế độ xem chính và bộ điều khiển chế độ xem phụ. Tôi muốn có thể gửi tin nhắn đến bộ điều khiển xem chính từ bộ điều khiển chế độ xem phụ. Làm thế nào tôi có thể nhận được một tham chiếu đến chính để tôi có thể gửi tin nhắn cho nó? Có cách nào tốt hơn để kiến trúc sư này?Kiến trúc một ứng dụng multiview trên iPhone
Trả lời
Nếu bộ điều khiển được tải từ NIB, bạn có thể xác định ổ cắm trên bộ điều khiển phụ và kết nối nó với bộ điều khiển chính trong bộ tạo giao diện.
Câu trả lời ngắn gọn: bạn có thể lấy lại cho đại biểu ứng dụng của bạn như thế này:
YourAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
Bạn rất có thể đã có một con trỏ để điều khiển xem gốc của bạn trong lớp ứng dụng đại biểu của mình. Và bạn có thể có con trỏ đến bộ điều khiển xem chính và phụ trong đối tượng điều khiển gốc. Vì vậy, bạn có thể viết mã như sau:
SecondaryViewController *primary = delegate.rootController.primaryController;
Sau đó, bạn có thể gửi tin nhắn đến nội dung trái tim của mình. Không cần cửa hàng; chỉ các thuộc tính cho mỗi bộ điều khiển xem.
Có nhiều câu trả lời dài hơn và cũng là một cuộc thảo luận về lý do tại sao thực tiễn này có thể có vấn đề vì nó giới thiệu các liên kết có khả năng không mong muốn giữa các đối tượng. Trong một thiết kế hướng đối tượng "thuần túy", bạn sẽ làm theo một mẫu thiết kế sạch sẽ với các liên kết rõ ràng giữa các đối tượng theo các hướng khác nhau cho phép bạn sử dụng lại mã một cách tốt hơn.
Tùy chọn khác là chuyển con trỏ tới các đối tượng mà lớp sẽ cần lúc khởi tạo. Thực hiện một initWithSomethingOrOther mới cho các lớp trình điều khiển khung nhìn của bạn và truyền các đối tượng vào như các tham số. Cache những con trỏ bạn cần (đừng quên giữ chúng) để sử dụng sau này.
Cách sạch để làm điều đó là để xác định một giao thức cho một đại biểu cho bộ điều khiển thứ cấp trong đó liệt kê các phương pháp cần phải có sự điều khiển chính để cung cấp:
@protocol SecondaryControllerDelegate <NSObject>
- (void)secondaryController:(SecondaryController*)secondaryController
frobFooWithBar:(Bar*)myBar;
- (BOOL)secondaryController:(SecondaryController*)secondaryController
shouldTwiddleBaz:(Baz*)currentBaz;
@end
Bây giờ thêm một tài sản đại biểu đến SecondaryController:
@interface SecondaryController : UIViewController {
id <SecondaryControllerDelegate> delegate;
...
}
// delegates are one of the few places you don't retain an object
@property (assign) id <SecondaryControllerDelegate> delegate;
...
Trong phần triển khai của SecondaryController, tổng hợp thuộc tính đại biểu. (Do không phát hành nó trong destructor.) Khi SecondaryController cần phải giao tiếp với PrimaryController, nó nên gọi phương thức thích hợp trên đại biểu.
Bây giờ làm PrimaryController của bạn thực hiện các giao thức SecondaryControllerDelegate:
@interface PrimaryController : UIViewController <SecondaryControllerDelegate> {
...
Thực hiện các phương pháp đại biểu trong PrimaryController.
Cuối cùng, hãy đặt PrimaryController của bạn làm đại biểu của SecondaryController. Chính xác như thế nào bạn làm điều này sẽ phụ thuộc vào việc bạn tạo SecondaryController trong một nib hay không. Nếu bạn làm thế, hãy tạo kết nối ở đó; nếu không, làm cho nó chỉ sau khi bạn cấp phát và init SecondaryController.
Tại sao bạn làm bài hát này và khiêu vũ?Vâng, khi bạn phải giới thiệu bộ điều khiển khác giữa Tiểu học và Trung học hoặc sử dụng Trung học ở nơi khác trong ứng dụng hoặc thậm chí sử dụng Trung học trong ứng dụng khác (tôi có một bộ điều khiển được sử dụng trong ba trong số bốn ứng dụng của tôi), bạn không phải thay đổi SecondaryController chút nào; bạn chỉ cần thay đổi bất kỳ lớp nào bây giờ sẽ là đại biểu của nó. Đây là một tiết kiệm thời gian đáng kinh ngạc trong thời gian dài.
Sử dụng NSNotificationCenter để liên lạc được tách riêng giữa các đối tượng.
- 1. Kiến trúc một ứng dụng iPhone phức tạp?
- 2. Kiến trúc của một ứng dụng PHP trên Amazon EC2
- 3. Kiến trúc ứng dụng ca cao trên Mac OS X
- 4. ứng dụng c/C++ dựa trên kiến trúc plug-in
- 5. Kiến trúc ứng dụng web dựa trên Akka
- 6. Kiến trúc cho các ứng dụng WinForms?
- 7. Kiến trúc "plugin" ứng dụng Web Java
- 8. Hướng dẫn Kiến trúc Ứng dụng Java
- 9. Kiến trúc của một ứng dụng web JavaScript đơn trang?
- 10. Sử dụng Ninject trong kiến trúc ứng dụng SOLID
- 11. Về mặt kiến trúc, các ứng dụng iPhone được cài đặt như thế nào từ AppStore?
- 12. Kiến trúc - Nhiều ứng dụng web hoạt động trên cùng một dữ liệu
- 13. Kiến trúc cho một ứng dụng Sinatra dựa trên thành phần mô-đun,
- 14. Kiến trúc Vị trí Lõi iPhone - Cách sử dụng nó trên nhiều Bộ điều khiển
- 15. Kiến trúc ứng dụng ASP.NET MVC "nguyên tắc"
- 16. Kiến trúc cho ứng dụng web ASP.NET mới
- 17. lời khuyên về kiến trúc các ứng dụng asp.net mvc
- 18. Xây dựng nhiều ứng dụng SWT kiến trúc với Maven
- 19. Kiến trúc sắc nét cho ứng dụng Winform?
- 20. Chuyển đến cấp độ kiến trúc ứng dụng
- 21. Ứng dụng iPhone trên iPhone vào Android
- 22. Kiến trúc và triển khai ứng dụng đa năng trong máy chủ ứng dụng GlassFish
- 23. Khi nào một dự án không yêu cầu một kiến trúc sư ứng dụng?
- 24. Kiến trúc dựa trên không gian?
- 25. Sử dụng OTP/Erlang như là một phần của kiến trúc dựa trên thành phần của ứng dụng web
- 26. Kiến trúc N-Layer
- 27. iPhone/iPod Touch: ứng dụng thực thi có chứa các kiến trúc không được hỗ trợ (s): armv7s
- 28. kiến trúc Agile
- 29. Kiến trúc MMORPG/VR
- 30. Kiến trúc Amazon S3
+1 cho NSNotificationCenter. –