我正在开发一个ios应用程序,它会在应用程序发送到后台后发送通知。当用户在MainviewController.swift中将值设置为true时,我只希望通知工作。所以我有这样的事情:
func setDelegateToTrue () {
Appdelegate().setToStart()
}
func setDelegateToFalse () {
Appdelegate().setToEnd()
}
在我的Appdelegate.swift中,我有类似的东西:
var started = false
func applicationDidEnterBackground(application: UIApplication) {
if(started) {
let notification: UILocalNotification = UILocalNotification()
notification.category = "FIRST_CATEGORY"
notification.alertBody = "do not forget your app"
notification.repeatInterval = NSCalendarUnit.Day
notification.timeZone = NSTimeZone.defaultTimeZone()
UIApplication.sharedApplication().scheduleLocalNotification(notification)
started = false
}
}
func setToStart() {
started = true
}
func setToEnd() {
started = false
}
没有if语句时通知正常,但是,当我有if语句并在viewdidload中调用setDelegateToTrue()时,它停止工作。似乎启动的布尔值是在调用setToStart()之后更改的,但实际上我可以从setToStart()中打印出来。任何人都可以帮助我吗?
答案 0 :(得分:2)
您的问题是,当您运行AppDelegate
时,您正在创建AppDelegate().setToStart()
的新实例。因此,当应用程序委托它稍后调用时,它的标志仍然设置为false,因为您在另一个实例上设置了一个标志(立即销毁)。
要执行您当前尝试的操作,您需要从delegate
(UIApplication
)获取sharedApplication
并在其上设置标记。
在与视图控制器等进行通信时请记住这一点,因为您总是需要获取要与之对话的实例而不是创建新实例。
答案 1 :(得分:1)
对于此行为,您可以使用NSUserDefault: 将Main ViewController中的值设置为:
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "shouldSendNotification")
并在app delegate的applicationDidEnterBackground中访问此用户默认值,如下所示:
func applicationDidEnterBackground(application: UIApplication) {
let shouldSendNotification = NSUserDefaults.standardUserDefaults().boolForKey("shouldSendNotification")
if shouldSendNotification {
let notification: UILocalNotification = UILocalNotification()
notification.category = "FIRST_CATEGORY"
notification.alertBody = "do not forget your app"
notification.repeatInterval = NSCalendarUnit.Day
notification.timeZone = NSTimeZone.defaultTimeZone()
UIApplication.sharedApplication().scheduleLocalNotification(notification)
NSUserDefaults.standardUserDefaults().setBool(false, forKey: "shouldSendNotification")
}
}
答案 2 :(得分:1)
你需要做的是
func setDelegateToTrue () {
AppDelegate.sharedAppDelegate().setToStart()
}
func setDelegateToFalse () {
AppDelegate.sharedAppDelegate().setToEnd()
}