iOS 9 个快速操作(3D Touch)
iOS 9 Quick Actions (3D Touch)
我正在尝试了解 iOS 9.
的快速操作 (3D Touch)
我希望用户 select 将 4 个滤镜中的 1 个应用于图像,因此如果我 select 第 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])
}
但是,当从菜单进入应用程序时,它将始终显示最后一个 selection(而不是当前的 selection)。如果我 select 第 1 项,则什么也没有发生。我select第3项,第1项会出现
我也尝试过通过appDelegate传递参数,结果是一样的。我认为生命周期存在一些问题。
有什么想法吗?
NSUserDefaults在flash上写数据,可能没那么快。
你可以再等一会儿,喜欢观察UIApplicationDidBecomeActiveNotification
而不是UIApplicationWillEnterForegroundNotification
。
或者您可以使用其他方式传递参数,例如,作为 AppDelegate
中的实例变量。
didFinishLaunchingWithOptions 方法总是在调用 performActionForShortcutItem 方法之前调用以响应快速操作。
因此,我认为您需要检查在 didFinishLaunchingWithOptions 方法中选择了哪种快速操作。如果应用程序未通过快速操作启动,您只需继续正常的应用程序启动过程。(默认过滤器)
如果您决定在 didFinishLaunchingWithOptions 中处理快速操作,则必须在 didFinishLaunchingWithOptions 中 return 否。
您可以从我的演示项目中获得更多想法:
我正在尝试了解 iOS 9.
的快速操作 (3D Touch)我希望用户 select 将 4 个滤镜中的 1 个应用于图像,因此如果我 select 第 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])
}
但是,当从菜单进入应用程序时,它将始终显示最后一个 selection(而不是当前的 selection)。如果我 select 第 1 项,则什么也没有发生。我select第3项,第1项会出现
我也尝试过通过appDelegate传递参数,结果是一样的。我认为生命周期存在一些问题。
有什么想法吗?
NSUserDefaults在flash上写数据,可能没那么快。
你可以再等一会儿,喜欢观察UIApplicationDidBecomeActiveNotification
而不是UIApplicationWillEnterForegroundNotification
。
或者您可以使用其他方式传递参数,例如,作为 AppDelegate
中的实例变量。
didFinishLaunchingWithOptions 方法总是在调用 performActionForShortcutItem 方法之前调用以响应快速操作。 因此,我认为您需要检查在 didFinishLaunchingWithOptions 方法中选择了哪种快速操作。如果应用程序未通过快速操作启动,您只需继续正常的应用程序启动过程。(默认过滤器)
如果您决定在 didFinishLaunchingWithOptions 中处理快速操作,则必须在 didFinishLaunchingWithOptions 中 return 否。
您可以从我的演示项目中获得更多想法: