2015-06-14 27 views
15

ja nie mogę znaleźć żadnej dokumentacji na registerUserNotificationSettings poza to, co zostało wyprodukowane w listopadzie ubiegłego roku (here), ale mój stary kod nie wydają się działać dla mnie więcej w Xcode 7 i Swift 2.Zmiany w rejestrzeUżytkownicyNotificationSettings w Swift 2?

mam ten kod w App Delegata:

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>)) 

teraz otrzymują następujące dwa błędy w ostatnim wierszu kodu:

„Element.Protocol” nie ma człon o nazwie „Alert”

i

nie może powoływać 'registerUserNotificationSettings' z listy argumentów typu '(UIUserNotificationSettings)'

Szukałem informacji na temat jakichkolwiek zmian, ale nie mogę znaleźć byle co. Czy brakuje mi czegoś oczywistego?

Odpowiedz

30

Zamiast (NSSet(array: [restartGameCategory])) as Set<NSObject>) z (NSSet(array: [restartGameCategory])) as? Set<UIUserNotificationCategory>) tak:

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

@ Banning na odpowiedź będzie działać, ale jest możliwe, aby to zrobić w bardziej Swifty sposób. Zamiast używać NSSet i odlewania w dół, możesz zbudować to od podstaw, używając zestawu o typowym typie UIUserNotificationCategory.

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

Warto również zauważyć, że zerwanie kodu na wiele linii pomoże ci zidentyfikować dokładnie problem. W tym przypadku twój drugi błąd jest tylko wynikiem pierwszego, ponieważ wyrażenia są wbudowane.

I jak został fachowo wskazany przez @stephencelis w komentarzu poniżej, Zestawy są ArrayLiteralConvertible, więc można zmniejszyć to aż do następujących.

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

To z pewnością wygląda o wiele ładniej niż mój oryginalny kod - dzięki, @ 0x7fffffff. –