2015-10-02 5 views
1

Я пытаюсь понять, делать быстрые действия (3D Touch) для прошивки 9.IOS 9 Быстрые действия (3D Touch)

Я хотел пользователя выбрать один из 4 фильтров, которые должны применяться к изображению, так что если я выберите элемент 1, я поставлю NSUserDefaults.standardUserDefaults() в фильтр, а затем покажу правильное изображение с применением фильтра.

В AppDelete.swift:

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { 
    var filterType:Int 
    switch (shortcutItem.type) { 
     ...set filterType 
    } 

    NSUserDefaults.standardUserDefaults().setInteger(filterType, forKey:"filterType") 
    NSUserDefaults.standardUserDefaults().synchronize()   
} 

В ViewController.swift:

override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"setDefaultFilter", name: UIApplicationWillEnterForegroundNotification, object:nil) // Handle enter from background 
    setDefaultFilter() 
} 

func setDefaultFilter() { 
    filterType = defaults.integerForKey("filterType") 
    ... 
    imageView.image = filterImage(defaultImage!, filter:filters[filterType]) 
} 

Однако при входе в приложение из меню, он всегда будет показывать последний выбор (не текущий выбор). Если я выберу пункт 1, ничего не произошло. Я выбираю пункт 3, появится пункт 1.

Я также пытаюсь передать параметры через appDelegate, и результат будет таким же. Я считаю, что есть некоторые проблемы с жизненным циклом.

Любые идеи?

ответ

1

NSUserDefaults записывает данные на вспышку, что может быть не так быстро.

Вы можете подождать немного дольше, например, наблюдать за UIApplicationDidBecomeActiveNotification, кроме UIApplicationWillEnterForegroundNotification.

Или вы можете использовать другие способы передачи параметров, например, в качестве переменной экземпляра в AppDelegate.

+0

UIApplicationDidBecomeActiveNotification, что сделал трюк! Я также попытался передать переменную экземпляра, но это не сработает, пока я не использую UIApplicationDidBecomeActiveNotification. –

0

didFinishLaunchingWithOptions метод всегда вызывается перед вызовом метода performActionForShortcutItem для ответа на быстрое действие. Итак, я думаю, что вам нужно проверить, какое быстрое действие выбрано в методе didFinishLaunchingWithOptions. Если приложение не запускается из быстрого действия, вы просто продолжаете свой обычный запуск приложения. (Фильтр по умолчанию)

И если вы решите обработать быстрые действия в файле didFinishLaunchingWithOptions, вы должны вернуть NO в файле didFinishLaunchingWithOptions.

Вы могли бы получить больше идей от моего демонстрационного проекта:

https://github.com/dakeshi/3D_Touch_HomeQuickAction

Смежные вопросы