2012-09-10 16 views
5

Tôi hiểu rằng các điều khiển giao diện người dùng như UITextField thông báo về các tương tác/sự kiện của khách hàng thông qua người được ủy quyền, được xác định là lớp hỗ trợ giao thức được yêu cầu.Các đại biểu đa phương tiện - nhiều lớp nhận thông báo từ các điều khiển giao diện người dùng trong iOS

Tôi thường thấy mình muốn nhận thông báo về sự kiện giao diện người dùng trong nhiều lớp, vì vậy, muốn hỗ trợ phát đa hướng. Ví dụ, chỉ định nhiều hơn một đại biểu cho một điều khiển giao diện người dùng. Tôi khá chắc chắn rằng không có tính năng khung công tác iOS nào hỗ trợ tính năng này. Tôi đã tự hỏi nếu có ai đã đưa ra một giải pháp tốt cho vấn đề này?

Trả lời

6

Có tính năng ca cao cho phép bạn xây dựng các đại biểu đa phương tiện dễ dàng - đó là hệ thống Message Forwarding được tích hợp trong khung công tác.

Tạo lớp ghi đè forwardInvocation: và trả về phiên bản đối tượng thay vì đại biểu. Đây là đôi khi được gọi là đối tượng trampoline ". Logic bên trong triển khai forwardInvocation: của bạn bây giờ có thể quyết định đối tượng "thực" nào sẽ nhận được thông báo và chuyển tiếp lời gọi tới một hoặc nhiều đối tượng trong số đó.

Như một cập nhật cho câu trả lời chấp nhận này, tôi đã tạo riêng thực hiện multicasting đại biểu của tôi ở đây:

http://www.scottlogic.co.uk/blog/colin/2012/11/a-multicast-delegate-pattern-for-ios-controls/

+0

Cảm ơn để làm nổi bật một tính năng ngôn ngữ rất thú vị mà tôi đã không nhận thức được. Tôi nghĩ rằng tôi có thể xây dựng những gì tôi yêu cầu bằng cách sử dụng này. – ColinE

+0

Trong ví dụ của Collin, thiếu điều là bạn cần phải thêm điều này: signature = [NSMethodSignature signatureWithObjCTypes: "@^v^c"]; to (NSMethodSignature *) methodSignatureForSelector: (SEL) phương pháp aSelector. – iosDeveloper

1

Bạn có thể thực hiện điều khiển UI của bạn trong lớp học của bạn, và sau đó lớp học của bạn sẽ nhận được thông báo từ giao diện người dùng này , bạn có thể gửi tin nhắn đến một lớp khác (sử dụng cùng một ủy nhiệm kỹ thuật - thực hiện thuộc tính ủy nhiệm trong lớp đầu tiên, và sau đó trong lớp thứ hai thực hiện phương thức ủy nhiệm từ lớp 1-st). Ví dụ, đối UITextField phương pháp -textFieldDidEndEditing:

Trong lớp đầu tiên -

1) thực hiện giao thức:

@protocol TextControllerDelegate <NSObject> 

@optional // Delegate protocols 
- (void)textFieldDidEndEditing:(UITextField *)textField; 

@end 

2) @property (nonatomic, unsafe_unretained, readwrite) id <TextControllerDelegate> delegate;

3) trong phương pháp - (void)textFieldDidEndEditing:(UITextField *)textField bên trong lớp , gọi [delegate textFieldDidEndEditing:textField]

Trong lớp thứ hai:

1) triển khai đối tượng của lớp học đầu tiên, đặt đại biểu thành tự (đến lớp thứ hai).

2) thực hiện phương pháp - (void)textFieldDidEndEditing:(UITextField *)textField

2

Một kỹ thuật để hỗ trợ multicasting là để cho lớp Delegating bạn các phương pháp sau:

@interface Delegator : NSObject - (void)addDelegate:(id<MyProtocol>)delegate; - (void)removeDelegate:(id<MyProtocol>)delegate; @end

Và lưu trữ các tài liệu tham khảo để các đại biểu trong một NSHashTable.

Xem việc thực hiện ở đây: http://arielelkin.github.io/articles/objective-c-multicast-delegate/

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