繁体   English   中英

iOS 9快速操作(3D触摸)

[英]iOS 9 Quick Actions (3D Touch)

我试图了解针对iOS 9进行快速操作(3D触摸)的方法。

我希望用户选择要应用于图像的4个滤镜中的1个,因此,如果我选择第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传递参数,结果是相同的。 我相信生命周期存在一些问题。

有任何想法吗?

NSUserDefaults将数据写入闪存,但速度可能不那么快。

您可以等待更长的时间,例如观察UIApplicationDidBecomeActiveNotification而不是UIApplicationWillEnterForegroundNotification

或者,您可以使用其他方式传递参数,例如,作为AppDelegate的实例变量。

在调用performActionForShortcutItem方法以响应快速操作之前,始终会调用didFinishLaunchingWithOptions方法。 因此,我认为您需要检查在didFinishLaunchingWithOptions方法中选择了哪种快速操作。 如果未通过快速操作启动应用程序,则只需继续正常的应用程序启动过程即可。(默认过滤器)

而且,如果您决定在didFinishLaunchingWithOptions中处理快速动作,则必须在didFinishLaunchingWithOptions中返回NO。

您可以从我的演示项目中获得更多想法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM