Программное соединение Storyboard с ViewController - PullRequest
0 голосов
/ 26 июня 2018

Я МЕДЛЕННО изучал, как создавать приложения для iOS с Swift, и кто-то прислал мне эту статью, почему он делает это профессионально: Пример использования раскадровок на 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

РЕДАКТИРОВАТЬ

Наряду с тем, что Кристиан Абелла сказал, мне также нужно было установить класс, подобный объекту раскадровки Class

1 Ответ

0 голосов
/ 26 июня 2018

Это выполнимо, и я делаю это в некоторых из моих проектов.Но вам нужно сделать следующее:

  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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...