使用ViewController以编程方式连接Storyboard

时间:2018-06-25 21:53:48

标签: ios swift xcode uiviewcontroller storyboard

我一直在缓慢地学习如何使用Swift构建iOS应用程序,而某人向他发送了这篇文章,他为何如此专业:A Case For Using Storyboards on iOS。尽管我采用了以编程方式学习如何构建iOS应用程序的方法,但我确实相信情节提要在iOS开发中占有一席之地。我正在尝试通过为每个具有自己的Marin Benčević的视图创建一个新的故事板来实现ViewController的想法。但是,我在连接此设备时遇到了问题。我不断遇到这个错误:

Failed to instantiate the default view controller for UIMainStoryboardFile 'LoginViewController' - perhaps the designated entry point is not set?

现在我的文件结构有所不同,因为我想使视图与控制器分离,但如下所示:

file structure

LoginViewController.swift:

class LoginViewController: UIViewController {
    override func viewDidLoad() {
        self.view.backgroundColor = UIColor.green
        let vc = LoginViewController.instance()
        self.present(vc, animated: true, completion: nil)
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let loginStoryboard = LoginViewController()

    self.window?.rootViewController = loginStoryboard
    self.window?.makeKeyAndVisible()

    return true
}

UIStoryboardExt.swift:

import UIKit

extension UIStoryboard {
    func initialViewController<T: UIViewController>() -> T {
        return self.instantiateInitialViewController() as! T
    }
}

UIViewControllerExt.swift:

import UIKit

extension UIViewController {
    class func instance() -> Self {
        let storyboardName = String(describing: self)
        let storyboard = UIStoryboard(name: storyboardName, bundle: nil)
        return storyboard.initialViewController()
    }
}

info.plist:

Main storyboard file base name: LoginViewController

总而言之,我想知道如何以编程方式将UIViewController连接到View.storyboard,而不必使用情节提要的属性选项卡。我已经尝试过很多不同的方法来完成此操作,但我似乎无法弄清楚。

这里是一个StackOverflow的问题,我也尝试着开始工作,但没有:StackOverflow

编辑

除了Christian Abella所说的那样,我确实还需要设置类似情节提要对象Class的类

1 个答案:

答案 0 :(得分:2)

这是可行的,我在某些项目中也这样做。 但是您需要执行以下操作:

  1. 从情节提要文件中删除所有“作为初始视图控制器” 标记。
  2. 在“应用程序的设置”中,转到“ 常规”标签,然后从“部署信息”中清除主界面
  3. 在“应用程序的设置”中,转到“ 信息”标签,然后清除“主故事板文件库名称”属性。

      self.window = UIWindow(frame: UIScreen.main.bounds)
    
      let main : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    
      let loginVC = main.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    
      self.window?.rootViewController = loginVC
      self.window?.makeKeyAndVisible()
    
      return true
    

正如@Losiowaty所指出的那样,您的viewDidLoad将导致无限循环,因此您需要在 LoginViewController 中删除该代码。