Swift - 在 App Delegate 中访问不同的视图控制器
Swift - Access different View Controllers in App Delegate
在 app delegate
中,一个只有 2 个屏幕的简单应用程序:
- 第一个屏幕是 Table 嵌入在导航控制器中的视图控制器
- 第二个屏幕是一个视图控制器,用于通过 protocol/delegate/segue
将项目添加到第一个屏幕 table
这是 app delegate
中 didFinishLaunchingWithOptions
的代码,我可以将第一个屏幕引用为 viewController[0]
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let navController = self.window?.rootViewController as! UINavigationController
let courseListController = navController.viewControllers[0] as! CourseListController
courseListController.managedObjectContext = self.managedObjectContext
return true
}
如何引用中间屏幕上方、下方和旁边的屏幕?请给我一个解决方案。谢谢!
转到您要引用的每个视图控制器,并在身份检查器中,将一些字符串添加到其 StoryBoard ID。
旁边引用它从新的 ViewController(比如,XViewController)到(比如,YViewController)
这样做:
var referencedViewController = self?.storyboard.
instantiateViewControllerWithIdentifier("referenceViewID") as! YViewController
self.presentViewController(referencedViewController,
animated: true, completion: nil)
重要的是要记住,故事板中所有 "peripheral" 视图控制器的视图控制器对象在执行到它们的 segue 之前实际上并不存在,所以没有办法直接从应用程序委托访问它们。相反,无论源视图控制器是什么,您都需要在创建时将状态推送到每个子视图控制器。 Segues 是执行此操作的合适方法。
您可能希望在 Interface Builder 中为中央视图控制器中的每个转场分配一个唯一的转场标识符。单击 segue,然后在此处输入:
在中央视图控制器中,实现 prepareForSegue(_:sender:)
,执行如下操作:
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) {
switch segue.identifier {
case "SegueIdentifier1":
guard let destination = segue.destinationViewController as? ViewController1 else {
return
}
// set up your view controller here
case "SegueIdentifier2":
guard let destination = segue.destinationViewController as? ViewController2 else {
return
}
// set up your view controller here
// add additional segues as required
default:
break // unknown segue
}
}
在 app delegate
中,一个只有 2 个屏幕的简单应用程序:
- 第一个屏幕是 Table 嵌入在导航控制器中的视图控制器
- 第二个屏幕是一个视图控制器,用于通过 protocol/delegate/segue 将项目添加到第一个屏幕 table
这是 app delegate
中 didFinishLaunchingWithOptions
的代码,我可以将第一个屏幕引用为 viewController[0]
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let navController = self.window?.rootViewController as! UINavigationController
let courseListController = navController.viewControllers[0] as! CourseListController
courseListController.managedObjectContext = self.managedObjectContext
return true
}
如何引用中间屏幕上方、下方和旁边的屏幕?请给我一个解决方案。谢谢!
转到您要引用的每个视图控制器,并在身份检查器中,将一些字符串添加到其 StoryBoard ID。
旁边引用它从新的 ViewController(比如,XViewController)到(比如,YViewController) 这样做:
var referencedViewController = self?.storyboard.
instantiateViewControllerWithIdentifier("referenceViewID") as! YViewController
self.presentViewController(referencedViewController,
animated: true, completion: nil)
重要的是要记住,故事板中所有 "peripheral" 视图控制器的视图控制器对象在执行到它们的 segue 之前实际上并不存在,所以没有办法直接从应用程序委托访问它们。相反,无论源视图控制器是什么,您都需要在创建时将状态推送到每个子视图控制器。 Segues 是执行此操作的合适方法。
您可能希望在 Interface Builder 中为中央视图控制器中的每个转场分配一个唯一的转场标识符。单击 segue,然后在此处输入:
在中央视图控制器中,实现 prepareForSegue(_:sender:)
,执行如下操作:
func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) {
switch segue.identifier {
case "SegueIdentifier1":
guard let destination = segue.destinationViewController as? ViewController1 else {
return
}
// set up your view controller here
case "SegueIdentifier2":
guard let destination = segue.destinationViewController as? ViewController2 else {
return
}
// set up your view controller here
// add additional segues as required
default:
break // unknown segue
}
}