Mar*_*man 5 uitabbarcontroller uiviewcontroller ios appdelegate nsuseractivity
目前,我已经在我的 AppDelegate 中实现了这两个方法
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)
和
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
Run Code Online (Sandbox Code Playgroud)
如果用户使用 Spotlight 的搜索结果打开我的应用程序,第一个将被调用,如果我的应用程序从 Apple Maps(因为它是一个路由应用程序)打开,则第二个将被调用。
我的问题是,UIViewController从 AppDELEGATE转到特定位置的最佳方法是什么(无论用户处于何种视图都独立)?
我问的原因是因为目前我正试图根据用户所在的位置手动导航到它。例如,它们可能位于以UIViewController模态显示的a中(然后需要关闭),或者它们可能位于 a 的深处,UINavigationController然后应用程序需要在其中调用popToRootViewController.
这样做的话,代码会变得杂乱无章,而且似乎无法正常工作。这样做似乎也不正确,因为它非常脆弱。
我只是想弄清楚如何实现您提到的第一种方法,并从https://www.hackingwithswift.com/read/32/4/how-to-add-core-spotlight-to-找到了一个有用的开始index-your-app-content 他的代码是:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
if userActivity.activityType == CSSearchableItemActionType {
if let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
let splitViewController = self.window!.rootViewController as! UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
if let masterVC = navigationController.topViewController as? MasterViewController {
masterVC.showTutorial(Int(uniqueIdentifier)!)
}
}
}
return true
}
Run Code Online (Sandbox Code Playgroud)
我发现self.window?.rootViewController 作为?yourRootViewControllerClass是您问题的一个很好的跳板。
我的代码非常基本,如下所示:
// create a storyBoard item to instantiate a viewController from. If you have multiple storyboards, use the appropriate one. I just have one so it is "Main"
let sb = UIStoryboard(name: "Main", bundle: nil)
// get the navigation controller from the window and instantiate the viewcontroller I need.
if let viewController = sb.instantiateViewControllerWithIdentifier("DetailViewController") as? ViewController,
let nav = window?.rootViewController as? UINavigationController {
viewController.setupController(bookName)// setup the viewController however you need to. I have a method that I use (I grabbed the bookName variable from the userActivity)
nav.pushViewController(viewController, animated: false)//use the navigation controller to present this view.
}
Run Code Online (Sandbox Code Playgroud)
这对我有用,但我必须提出警告。我的应用程序只有一个故事板和三个视图控制器(NavController->tableViewController->ViewController)。我不确定这个逻辑在更复杂的应用程序上如何工作。
另一个很好的参考是: http: //www.appcoda.com/core-spotlight-framework/
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
let viewController = (window?.rootViewController as! UINavigationController).viewControllers[0] as! ViewController
viewController.restoreUserActivityState(userActivity)
return true
}
Run Code Online (Sandbox Code Playgroud)
该 viewController 有这个方法:
override func restoreUserActivityState(activity: NSUserActivity) {
if activity.activityType == CSSearchableItemActionType {
if let userInfo = activity.userInfo {
let selectedMovie = userInfo[CSSearchableItemActivityIdentifier] as! String
selectedMovieIndex = Int(selectedMovie.componentsSeparatedByString(".").last!)
performSegueWithIdentifier("idSegueShowMovieDetails", sender: self)
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |