gpt4 book ai didi

ios - 带操作按钮的 UILocalNotification

转载 作者:行者123 更新时间:2023-11-30 14:13:23 29 4
gpt4 key购买 nike

我创建了一个 UILocationNotification,其中有两个操作按钮,一个调用 sleep ,一个调用立即唤醒。因此,一旦用户看到通知,如果他们现在按下唤醒,应用程序将启动并执行一些代码由于某种原因应用程序启动然后拒绝执行代码

FYI : The code for the UILocalNotification were implement and they are working, the only problem is when I pressed the wake up now button.

 func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler: () -> Void) {
if notification.category == "options" {
if identifier == "Sleep"{

println("sleep more lazy bumm")
}
else if identifier == "wakeup"{
var object = ViewController()
object.wakeupnow()

}
}

我采取的第二种方法,但它仍然不起作用

    func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler: () -> Void) {
if notification.category == "options" {
if identifier == "Sleep"{

println("sleep more lazy bumm")
}
else if identifier == "wakeup"{
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("wake"), name: UIApplicationWillEnterForegroundNotification, object: nil)

}
}

fun wake(){
var alertview = UIAlertView()
alert.message = "Good job you are up now, so lets get to work"
alert.addButtonWithTitle("ok")
alert.cancelButtonIndex = 0
alert.show()
}

最佳答案

请记住,application:handleActionWithIdentifer:forLocalNotification:completionHandler: 在后台线程中被调用。如果您在用户界面中执行任何操作,则需要在主队列上执行。

此外,您必须尽快调用completionHandler block ,否则系统将终止您的应用程序。

请参阅有关此内容的 Apple 文档:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleActionWithIdentifier:forLocalNotification:completionHandler :

此外,在您的第一个示例中,您正在实例化 View Controller 并在其上调用函数,但您实际上并未呈现 View Controller - 您希望该 View Controller 发生什么情况?您需要做一些事情才能使其出现,这取决于您的应用程序的结构。例如,您可能希望在根导航 Controller 上以模态方式呈现它。或者您可能想在已经存在的 ViewController 上调用该函数,在这种情况下,您需要在某处保留对它的引用,而不是在触发通知操作时实例化一个新函数。

在第二个示例中,您将自己添加为 NSNotificationCenter 的观察者,而不是实际发布通知,因此当然您的函数永远不会被调用。如果您想采用这种方法,则需要提前调用 addObserver - 在 applicationDidFinishLaunching: 中,例如:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("wake"), name: "wakeup", object: nil)

然后,在您的 handleActionWithIdentifier: 函数中,调用:

NSNotificationCenter.defaultCenter().postNotificationName("wakeup", object: nil)

这应该会导致您的 wake 函数被调用。不过,尝试从后台线程显示警报 View 仍然存在问题,因此您需要将调用包装在dispatch_async中:

func wake(){
var alertview = UIAlertView()
alert.message = "Good job you are up now, so lets get to work"
alert.addButtonWithTitle("ok")
alert.cancelButtonIndex = 0
dispatch_async(dispatch_get_main_queue(),{
alert.show()
})
}

顺便说一句,UIAlertView 已被弃用,应由 iOS 8 及更高版本的 UIAlertController 取代。

关于ios - 带操作按钮的 UILocalNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31504503/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com