Swift - 访问App Delegate中的不同View Controller

时间:2016-05-21 15:35:01

标签: swift viewcontroller appdelegate

app delegate中,只有2个屏幕的简单应用程序:

  • 第一个屏幕是嵌入在导航控制器中的表视图控制器
  • 第二个屏幕是一个视图控制器,用于通过protocol / delegate / segue将项目添加到第一个屏幕表

这是didFinishLaunchingWithOptionsapp delegate的代码,我可以将第一个屏幕引用为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
    }

如何参考中心屏幕上方,下方和旁边的屏幕?请建议我一个解决方案。谢谢!

2 个答案:

答案 0 :(得分:1)

重要的是要记住,故事板中所有“外围”视图控制器的视图控制器对象实际上不会存在,直到执行它们的segue,因此无法访问他们直接来自app delegate。相反,您需要将状态推送到每个子视图控制器,无论源视图控制器是什么。 Segues是执行此操作的合适方式。

您可能希望在中央视图控制器中为Interface Builder中的每个segue分配一个唯一的segue标识符。单击segue,然后在此处输入:

enter image description here

在中央视图控制器中,实施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

    }
}

答案 1 :(得分:0)

转到要引用的每个视图控制器,并在身份检查器中,向其StoryBoard ID添加一些字符串。

接下来将它从新的ViewController(比方说,XViewController)引用到(例如,YViewController) 这样做:

var referencedViewController = self?.storyboard.
instantiateViewControllerWithIdentifier("referenceViewID") as! YViewController

self.presentViewController(referencedViewController,
 animated: true, completion: nil)