打开特定视图的通知
Open notification to specific view
我正在 Swift 开发一款使用推送通知的应用程序。到目前为止,我的 AppDelegate 中有以下代码:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
println("Received alert and opened it")
debugPrintln(userInfo)
if application.applicationState == UIApplicationState.Active {
// App in foreground
println("App in foreground already")
} else {
// App in background
if let tripId = (userInfo["trip"] as? String)?.toInt() {
println(tripId)
Trips.load(tripId) { (responseCode, trip) in
debugPrintln("Got the trip")
if let trip = trip {
if let window = self.window {
if let rootViewController = window.rootViewController {
if let storyboard = rootViewController.storyboard {
let viewController = storyboard.instantiateViewControllerWithIdentifier("Trip") as! TripViewController
viewController.trip = trip
rootViewController.presentViewController(viewController, animated: true, completion: nil)
} else {
println("No storyboard")
}
} else {
println("No root view controller")
}
} else {
println("No window")
}
}
}
} else {
println("Failed to get trip id")
}
}
}
情节提要的构造是,当应用程序首次打开时,它会打开 LoginViewController,后者会检查登录状态并重定向到包含行程列表的 NavigationController。从列表中,用户可以点击行程以打开 TripViewController(请参阅 screenshot)。
当我 运行 我的应用程序并测试点击推送通知时,该应用程序加载了行程列表,我在控制台中看到以下日志:
2015-09-04 09:50:07.158 GoDriver[883:377922] Warning: Attempt to present <GoDriver.TripViewController: 0x15f5b260> on <GoDriver.LoginViewController: 0x15d910e0> whose view is not in the window hierarchy!
我是否必须加载我的导航控制器并用 TripViewController 填充它?
如果您正在使用 UIStoryBoard
并使用 initialViewController
,iOS 会自动执行必要的操作,即加载它,如果需要创建 navigationController 并将其加载到 window .
但是在这种情况下,您需要手动执行此操作。您需要创建一个 UINavigationController,用您的 TripViewController 填充它并用 UIWindow
挂钩它。
我正在 Swift 开发一款使用推送通知的应用程序。到目前为止,我的 AppDelegate 中有以下代码:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
println("Received alert and opened it")
debugPrintln(userInfo)
if application.applicationState == UIApplicationState.Active {
// App in foreground
println("App in foreground already")
} else {
// App in background
if let tripId = (userInfo["trip"] as? String)?.toInt() {
println(tripId)
Trips.load(tripId) { (responseCode, trip) in
debugPrintln("Got the trip")
if let trip = trip {
if let window = self.window {
if let rootViewController = window.rootViewController {
if let storyboard = rootViewController.storyboard {
let viewController = storyboard.instantiateViewControllerWithIdentifier("Trip") as! TripViewController
viewController.trip = trip
rootViewController.presentViewController(viewController, animated: true, completion: nil)
} else {
println("No storyboard")
}
} else {
println("No root view controller")
}
} else {
println("No window")
}
}
}
} else {
println("Failed to get trip id")
}
}
}
情节提要的构造是,当应用程序首次打开时,它会打开 LoginViewController,后者会检查登录状态并重定向到包含行程列表的 NavigationController。从列表中,用户可以点击行程以打开 TripViewController(请参阅 screenshot)。
当我 运行 我的应用程序并测试点击推送通知时,该应用程序加载了行程列表,我在控制台中看到以下日志:
2015-09-04 09:50:07.158 GoDriver[883:377922] Warning: Attempt to present <GoDriver.TripViewController: 0x15f5b260> on <GoDriver.LoginViewController: 0x15d910e0> whose view is not in the window hierarchy!
我是否必须加载我的导航控制器并用 TripViewController 填充它?
如果您正在使用 UIStoryBoard
并使用 initialViewController
,iOS 会自动执行必要的操作,即加载它,如果需要创建 navigationController 并将其加载到 window .
但是在这种情况下,您需要手动执行此操作。您需要创建一个 UINavigationController,用您的 TripViewController 填充它并用 UIWindow
挂钩它。