2009-03-05 28 views
8

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

0

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.

7

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.

4

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.

0

Sử dụng NSNotificationCenter để liên lạc được tách riêng giữa các đối tượng.

+0

+1 cho NSNotificationCenter. –

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