14432


以下のサイトを参考にして、通知をスライドしたら、アクションが表示させるアプリをSwiftで書いてみました。  
[SwiftのNotificationでHello,
Worldして、アクションを3つ作ってみた](http://qiita.com/kiiita/items/453426e3873e58dc8768)

これを応用して、状況に応じてアクションAとアクションB、アクションAとアクションCの二つのパターン表示できるようにしたいです。この画像のように２パターンできるようにしたいです。

そう思って以下のコードを書いたのですが、これだとtaskCategoryだけしか表示されません。  
２つのパターン表示できるようにするにはどうしたらいいでしょうか。お願いします。

自分が書いたコードでは、アクションはそれぞれLATER、DELETE、OPENにしてあります。

[![画像の説明をここに入力](https://i.stack.imgur.com/rwETL.png)](https://i.stack.imgur.com/rwETL.png)

[code]

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Actions
        let leterAction:UIMutableUserNotificationAction = UIMutableUserNotificationAction()
        leterAction.identifier = "LETER_ACTION"
        leterAction.title = "Leter"
    
        leterAction.activationMode = UIUserNotificationActivationMode.Background
        leterAction.destructive = false
        leterAction.authenticationRequired = true
    
        let deleteAction:UIMutableUserNotificationAction = UIMutableUserNotificationAction()
        deleteAction.identifier = "DELETE_ACTION"
        deleteAction.title = "Delete"
    
        deleteAction.activationMode = UIUserNotificationActivationMode.Background
        deleteAction.destructive = false
        deleteAction.authenticationRequired = true
    
        let openAction:UIMutableUserNotificationAction = UIMutableUserNotificationAction()
        openAction.identifier = "OPEN_ACTION"
        openAction.title = "Open"
    
        openAction.activationMode = UIUserNotificationActivationMode.Background
        openAction.destructive = false
        openAction.authenticationRequired = true
    
        // category
    
        let todoCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
        todoCategory.identifier = "TODO_CATEGORY"
        let taskCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
        taskCategory.identifier = "TASK_CATEGORY"
    
        let openActions:NSArray = [openAction, deleteAction]
        let taskActions:NSArray = [leterAction, deleteAction]
    
        todoCategory.setActions(openActions as? [UIUserNotificationAction], forContext: UIUserNotificationActionContext.Default)
        taskCategory.setActions(taskActions as? [UIUserNotificationAction], forContext: UIUserNotificationActionContext.Default)
    
        // NSSet of all our categories
        let category1:NSSet = NSSet(objects: todoCategory)
        let category2:NSSet = NSSet(objects: taskCategory)
        let types: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Sound]
    
        UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: types, categories: category1 as? Set<UIUserNotificationCategory>))
        UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: types, categories: category2 as? Set<UIUserNotificationCategory>))
    
        return true
    }
    
[/code]


CC BY-SA 3.0
2015-08-14T06:02:45.117
14415
2015-08-14T16:15:47.620
2015-08-14T15:52:56.183
5519
question
swift xcode iphone notification
swiftでNotification actionを 2パターン作りたい


> そう思って以下のコードを書いたのですが、これだとtaskCategoryだけしか表示されません。

原因は下記の部分の`registerUserNotificationSettings(_:
UIUserNotificationSettings)`のところで、最初に`todoCategory`を登録したあと、`taskCategory`で上書きしてしまっているからですね。

[code]

    let category1:NSSet = NSSet(objects: todoCategory)
    let category2:NSSet = NSSet(objects: taskCategory)
    let types: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Sound]
    
    UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: types, categories: category1 as? Set<UIUserNotificationCategory>))
    UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: types, categories: category2 as? Set<UIUserNotificationCategory>))
    
[/code]

カテゴリは`Set`を使って複数登録できるという仕組みなので、`Set`に１件ずつ入れてしまっていいては意味がありません。

`Set`オブジェクトに複数のカテゴリを格納して、複数のカテゴリを登録する、という処理にしなければなりません。

たとえば下記のようにします。  
ついでに`NSSet`を使うとキャストが必要になるので、`Set`に変更しました。

[code]

    let types: UIUserNotificationType = [UIUserNotificationType.Alert, UIUserNotificationType.Sound]
    let categories = Set(arrayLiteral: todoCategory, taskCategory)
    UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: types, categories: categories))
    
[/code]


CC BY-SA 3.0
2015-08-14T16:15:47.620
14432
2015-08-14T16:15:47.620
5519
14415
answer