2015-06-14 13 views
15

tôi dường như không thể tìm thấy bất kỳ tài liệu trên registerUserNotificationSettings xa hơn những gì được sản xuất cuối tháng mười (here), nhưng mã cũ của tôi dường như không làm việc cho tôi nữa trong Xcode 7 và Swift 2.Thay đổi để đăng kýUserNotificationCài đặt trong Swift 2?

Tôi có mã này trong App đại biểu:

let endGameAction = UIMutableUserNotificationAction() 
endGameAction.identifier = "END_GAME" 
endGameAction.title = "End Game" 
endGameAction.activationMode = .Background 
endGameAction.authenticationRequired = false 
endGameAction.destructive = true 

let continueGameAction = UIMutableUserNotificationAction() 
continueGameAction.identifier = "CONTINUE_GAME" 
continueGameAction.title = "Continue" 
continueGameAction.activationMode = .Foreground 
continueGameAction.authenticationRequired = false 
continueGameAction.destructive = false 

let restartGameCategory = UIMutableUserNotificationCategory() 
restartGameCategory.identifier = "RESTART_CATEGORY" 
restartGameCategory.setActions([continueGameAction, endGameAction], forContext: .Default) 
restartGameCategory.setActions([endGameAction, continueGameAction], forContext: .Minimal) 

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: (NSSet(array: [restartGameCategory])) as Set<NSObject>)) 

bây giờ tôi nhận được hai lỗi sau trên dòng cuối cùng của mã:

'Element.Protocol' không có một thành viên có tên là 'Cảnh báo'

Không thể gọi 'registerUserNotificationSettings' với một danh sách đối số kiểu '(UIUserNotificationSettings)'

Tôi đã tìm kiếm thông tin về bất kỳ thay đổi, nhưng tôi không thể tìm thấy bất cứ điều gì. Tôi có thiếu một cái gì đó hiển nhiên?

Trả lời

30

Thay vì sử dụng (NSSet(array: [restartGameCategory])) as Set<NSObject>) với (NSSet(array: [restartGameCategory])) as? Set<UIUserNotificationCategory>) như vậy:

application.registerUserNotificationSettings(
    UIUserNotificationSettings(
     forTypes: [.Alert, .Badge, .Sound], 
     categories: (NSSet(array: [restartGameCategory])) as? Set<UIUserNotificationCategory>)) 
21

@ Cấm của câu trả lời sẽ làm việc, nhưng nó có thể làm điều này trong một Swifty cách hơn. Thay vì sử dụng NSSet và ngừng truyền, bạn có thể tạo điều này từ đầu bằng Bộ có loại chung UIUserNotificationCategory.

let categories = Set<UIUserNotificationCategory>(arrayLiteral: restartGameCategory) 
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories) 
application.registerUserNotificationSettings(settings) 

Điều đáng lưu ý là việc chia nhỏ mã lên nhiều dòng sẽ giúp bạn xác định chính xác vị trí của vấn đề. Trong trường hợp này, lỗi thứ hai của bạn chỉ là kết quả của lỗi đầu tiên vì các biểu thức được inlined.

Và như đã được chuyên gia chỉ ra bởi @stephencelis trong bình luận của mình bên dưới, Bộ là ArrayLiteralConvertible, vì vậy bạn có thể giảm bớt tất cả các cách xuống dưới đây.

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: [restartGameCategory]) 
+0

Điều đó chắc chắn trông gọn gàng hơn mã ban đầu của tôi - cảm ơn, @ 0x7fffffff. –

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