2016-07-11 32 views
7

Các thông báo mới hiện không hoạt động trong Swift 3? Tôi đang làm:NSNotifications trong Swift 3

NotificationCenter.default().post(name: DidTouchParticleView, 
            object: self.particle as? AnyObject) 

trong chế độ xem của chế độ xem tùy chỉnhBan() và tôi cần gửi đối tượng xem nếu có. Vì vậy, tôi làm điều này:

NotificationCenter.default().addObserver(forName: DidTouchParticleView, 
             object: self, 
             queue: OperationQueue.main(), 
             using: presentParticleDisplayView(notification:)) 

trong chế độ xem của bộ điều khiển chế độ xemDidLoad(). Tôi chắc chắn rằng bộ điều khiển xem cụ thể đó là trình điều khiển được hiển thị khi tôi nhấn vào chế độ xem tùy chỉnh của mình, tuy nhiên, hàm presentParticleDisplayView(notification:) không bao giờ được gọi.

Ngoài ra, DidTouchParticleView được định nghĩa toàn cầu như thế này:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

Đây có phải là do các phiên bản beta, hay tôi làm điều gì sai?

+0

Trong bản beta hiện tại và trong Swift 3, các dấu ngoặc đơn sau 'mặc định()' sẽ bị xóa; nó là 'NotificationCenter.default'. – matt

Trả lời

11

Có vẻ như bạn có ý định gọi addObserver(_:selector:name:object:), trong đó thông báo tham số thứ hai (số selector:) được gửi đến tham số đầu tiên (mục tiêu).

Thay vào đó, bạn đang gọi sai phương thức, addObserver(forName:object:queue:using:), hoạt động hoàn toàn khác.

Ngoài ra, như để phần thứ hai của câu hỏi của bạn:

let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 

Đó là chính xác (gần như); phải là

let DidTouchParticleView = Notification.Name("didTouchParticleView") 

Tất cả tên thông báo hiện là Notification.Name trường hợp. Cách thích hợp để làm điều này là để nói:

extension Notification.Name { 
    static let didTouchParticleView = Notification.Name("didTouchParticleView") 
} 

Sau đó, bạn có thể tham khảo tên thông báo là .didTouchParticleView trong suốt mã của bạn.

1

Bạn đang tự mình đăng thông báo (object: self). Bạn có thể có nghĩa là một cái gì đó như object: particle hoặc có thể object: nil trong cuộc gọi addObserver (nhưng sau đó hãy cẩn thận để đảm bảo đó là hạt đúng trong trình xử lý). Đọc lại tài liệu cho phương pháp này và lưu ý cẩn thận thông số object là gì.

Lưu ý rằng phiên bản addObserver trả về đối tượng quan sát viên. Bạn phải lưu trữ nó để sau đó bạn có thể gọi removeObserver với nó.

+0

Thay đổi 'đối tượng' thành nil giải quyết nó. Tuy nhiên, làm thế nào để nó biết những gì đã trở thành người quan sát? Trước đó, trong Swift 2, có sử dụng 'addObserver:' để lấy một đối tượng làm người quan sát. –

+1

@YoussefSami Không, bạn không hiểu những gì đang diễn ra trước đây. 'Đối tượng' là _never_ người quan sát. Người quan sát được _returned_ từ cuộc gọi. Đừng nhầm lẫn điều này với 'addObserver (_: selector: name: object:)', trong đó tham số đầu tiên _is_ người quan sát. Xem ngay câu trả lời đã chỉnh sửa của tôi. – matt

+0

@matt Vâng, đó là cái mà tôi đang đề cập đến. Vậy Trung tâm thông báo hiện đang biết đối tượng nào gửi thông báo? –