在 App Delegate 中设置 Init VC?

Posted

技术标签:

【中文标题】在 App Delegate 中设置 Init VC?【英文标题】:Setting Init VC in App Delegate? 【发布时间】:2017-02-25 14:23:59 【问题描述】:

我正在尝试使用我的应用程序的 init VC 来初始化我的核心数据堆栈。为此,我想在加载时将我创建的核心数据管理器传递给第一个 VC。

我认为这段代码将 coredatamanager 传递给 VC 是有意义的,但是无论我以哪种方式编写这段代码都会出错,我确定我错过了一些简单的东西吗?

        // Initialize Storyboard
    let storyboard = UIStoryboard(name: "RoutineController", bundle: Bundle.main)

    // Instantiate Initial View Controller
    if let viewController = storyboard.instantiateInitialViewController() as? ViewController 
        // Configure View Controller
        viewController.coreDataManager = coreDataManager

        // Set Root View Controller
        window?.rootViewController = viewController
    

错误很简单:

使用未声明的类型'ViewController'

但是,如果我删除 'as? ViewController' 我在以下行中收到一个错误,即 viewController 没有属性 coreDataManager。

在发送到视图控制器的 viewdidload 中是否需要定义某种委托?

EDIT 修改了我的代码以更正情节提要 ID,但是 中的代码似乎没有执行,由于 if let 失败,我得到了我写的打印错误,所以这仍然不是设置 viewController 的正确方法...关于为什么的任何想法?

        // Initialize Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate Initial View Controller
    if let viewController = storyboard.instantiateInitialViewController() as? RoutineController 

        // Configure View Controller
        print("SENDING THIS INFO TO THE FIRST VC \(self.coreDataManager)")
        viewController.coreDataManager = self.coreDataManager
        // Set Root View Controller
        window?.rootViewController = viewController
     else 
        print("WE COULDNT SET VIEWCONTROLLER AS THE DESIGNATED VC SO MOC WASNT PASSED")
    

【问题讨论】:

您确定您的故事板文件名为 RoutineController.storyboard? 不,VC 被称为 RoutineController,情节提要是主要的,如果有人可以验证这是准确的,则用现在似乎可以工作的 OP 更新了 OP... 【参考方案1】:

这是你的问题:

as? ViewController

应该是

as! UIViewController

或者,这也应该有效:

as! RoutineController

【讨论】:

我是这么想的,但后来它抛出“来自 'UIViewController 的向下转换?'到 'UIViewController' 只解开可选项;你的意思是使用 '!' 吗?" 是的,我认为直接将其转换为控制器名称可能是解决方案,我会做进一步的测试 太棒了!祝你好运。【参考方案2】:

在情节提要中选择 RoutineController 并设置情节提要 ID

然后在此处使用 Storyboard ID:

    if let viewController = storyboard.instantiateViewController(withIdentifier: "<storyboardID>") as? RoutineController 

【讨论】:

谢谢 这似乎有道理并且不会引发错误,但是 中的代码在 as 之后?例程控制器没有运行,更新了 OP,打印命令根本没有运行【参考方案3】:

解决方法是需要在if let viewController中定义一个标识符才能成功找到,工作代码如下:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    if let viewController = storyboard.instantiateViewController(withIdentifier: "TabBarController") as? TabBarController 
        viewController.coreDataManager = self.coreDataManager
        window?.rootViewController = viewController

【讨论】:

以上是关于在 App Delegate 中设置 Init VC?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TabBar 和 NavBar 在 App Delegate 中配置窗口

无法在 App Delegate (Swift) 中更新 titleView 图像

如果启动窗口位于不同的项目/库中,如何在 App.xaml 中设置 StartupUri?

如何在 __init__ 中设置 python 属性

在 UICollectionViewCell 中设置 UILabel

SKSpriteNode 在 init(NSCoder) 中设置颜色