2013-04-11 26 views
7

tôi cần phải gửi thông báo @"willAnimateRotationToInterfaceOrientation" với các thông số toInterfaceOrientationduration (câu hỏi # 1) cho tất cả UIViewController về việc áp dụng (câu hỏi # 2). Làm thế nào để viết mã cho điều đó?Làm thế nào để gửi thông báo với các tham số trên Objective-C?

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(willAnimateRotationToInterfaceOrientation:toInterfaceOrientation:duration) 
     name:@"willAnimateRotationToInterfaceOrientation" 
     object:nil]; 

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"willAnimateRotationToInterfaceOrientation" 
       object:self]; 
+0

Câu hỏi liên quan: http://stackoverflow.com/questions/15957077/event-willanimaterotationtointerfaceorientation-isnt-calling – Dmitry

Trả lời

19

Sử dụng postNotificationName:object:userInfo: và bó bất kỳ thông số bạn muốn vượt qua bên trong từ điển userInfo.

Ví dụ:

Bạn có thể gửi một thông báo như thế này

NSDictionary * userInfo = @{ @"toOrientation" : @(toOrientation) }; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"willAnimateRotationToInterfaceOrientation" object:nil userInfo:userInfo]; 

Và sau đó lấy thông tin mà bạn trôi qua, bằng cách thực hiện:

- (void)willAnimateRotationToInterfaceOrientation:(NSNotification *)n { 
    UIInterfaceOrientation toOrientation = (UIInterfaceOrientation)[n.userInfo[@"toOrientation"] intValue]; 
    //.. 
} 

Để tóm tắt những gì đã thấy ở trên, bộ chọn được sử dụng để xử lý thông báo có một tham số tùy chọn loại NSNotification và bạn có thể lưu trữ bất kỳ thông tin nào bạn muốn chuyển xung quanh bên trong userInfo từ điển.

+0

Cảm ơn, Gabriele đã trả lời! Bạn có mã mẫu không? – Dmitry

+1

Có, chỉ một giây :) –

+0

Mã có các lỗi sau: 1. Không mong đợi '@' trong chương trình. 2. Phần tử sưu tập kiểu 'UIInterfaceOrientation' (aka 'enum UIInterfaceOrientation') không phải là đối tượng Objective-C. – Dmitry

0

Bạn thực hiện một phương thức gọi dễ dàng hơn, điều này đòi hỏi ít đối số hơn và thực hiện cuộc gọi phức tạp cho bạn.

[[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(doStuff) 
     name:@"willAnimateRotationToInterfaceOrientation" 
     object:nil]; 

- (void)doStuff { 
    [self willAnimateRotationToInterfaceOrientation:someOrientation 
            toOrientation:someOtherOrientation 
             duration:1]; 
} 

Bạn không nên gọi willAnimateRotationToInterfaceOrientation: mình mặc dù. Thay vào đó, hãy tạo một phương thức được gọi là biểu mẫu mà phương thức chứa mã bạn muốn kích hoạt khi quay và cũng có các lần khác.

+0

Nhưng cách chuyển các tham số bằng cách sử dụng 'userInfo'? – Dmitry

1

Điều này không hoạt động theo cách bạn nghĩ. Một cuộc gọi tin nhắn thông báo có một tham số tùy chọn, đó là một đối tượng NSNotification:

-(void)myNotificationSelector:(NSNotification*)note; 
-(void)myNotificationSelector; 

Đối tượng thông báo có một tài sản, userInfo, đó là một cuốn từ điển có thể được sử dụng để truyền thông tin liên quan. Nhưng bạn không thể đăng ký bộ chọn tùy ý để được gọi bởi trung tâm thông báo. Bạn chuyển từ điển đó bằng thông báo bằng cách sử dụng -postNotificationName:object:userInfo: thay vì -postNotificationName:object:; thông số userInfo chỉ là một NSDictionary mà bạn tạo.

+0

Cảm ơn, nhưng có thể gửi thông báo đến tất cả (hoặc tất cả) hiển thị) 'UIViewController' của ứng dụng? – Dmitry

+0

Chỉ khi tất cả họ đã đăng ký cho thông báo đó. Lưu ý rằng có một thông báo hiện có, 'UIDeviceOrientationDidChangeNotification' có sẵn nếu bạn yêu cầu bằng cách gọi' [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] '(nhưng bạn vẫn phải đăng ký từng bộ điều khiển xem cho nó). –

+0

'UIDeviceOrientationDidChangeNotification' đang gọi sau khi xoay - không phải bên trong vòng quay là' willAnimateRotationToInterfaceOrientation'.Xin lỗi cho câu hỏi noob có thể, nhưng chúng ta đang gọi 'postNotificationName' với tham số' object: self' - nó sẽ chỉ được gửi đến đối tượng 'self'? – Dmitry

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