#swift #uiviewcontroller
#swift #uiviewcontroller
Вопрос:
Читая «Learn Swift by Building Applications» Эмиля Атанасова, я пытаюсь написать код в делегате приложения, чтобы запустить приложение TabbarViewController
, если пользователь уже вошел в систему (а не SignInViewController). Однако, несмотря на написание двух похожих функций для экрана входа в систему и основного контроллера представления (таких же, как в книге), я получаю множество ошибок в функции загрузки основного контроллера представления — openMainViewController ()
ошибки: «Сопоставление с шаблоном в условии требует
case
ключевого слова» «Использование неразрешенного идентификатораrootViewController
«
Я отследил книгу, убедился, что идентификаторы совпадают в основной раскадровке (хотя TabbarViewController
у нее нет класса, это нормально?)
func openSignInScreen() {
if let signInViewController = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "SignInViewController") as? SignInViewController {
signInViewController.view.frame = (self.window?.rootViewController?.view.frame)!
signInViewController.view.layoutIfNeeded()
//nice transition between views
UIView.transition(with: window!, duration: 0.3, options: .transitionCrossDissolve, animations: {self.window?.rootViewController = signInViewController }, completion: { completed in //nothing to do here
})
}
}
//continue.. now open main View Controller
func openMainViewController() {
if let rootViewController() = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TabbarViewController") {
rootViewController().view.frame = (self.window?.rootViewController?.view.frame)!
rootViewController().view.layoutIfNeeded()
//nice transition between views
UIView.transition(with: window!, duration: 0.3, options: .transitionCrossDissolve, animations: {self.window?.rootViewController = rootViewController() }, completion: { completed in //maybe do something here
})
}
}
Я ожидаю, что, поскольку я написал код так же, как в книге, проблем с идентификацией не возникнет. Однако я получаю кучу ошибок в openMainViewController()
функции, и я действительно новичок в программировании в целом, поэтому пока не знаю, куда идти.
Ответ №1:
Я подозреваю, что вы допустили ошибку при копировании из книги
Замените ваш rootViewController()
на rootViewController
, поскольку это должно быть константой, а не методом. как и в openSignInScreen()
Таким образом, ваше обновление openMainViewController
будет
func openMainViewController() {
if let rootViewController = self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TabbarViewController") {
rootViewController.view.frame = (self.window?.rootViewController?.view.frame)!
rootViewController.view.layoutIfNeeded()
//nice transition between views
UIView.transition(with: window!, duration: 0.3, options: .transitionCrossDissolve, animations: {self.window?.rootViewController = rootViewController }, completion: { completed in //maybe do something here
})
}
}
Примечание: чтобы это работало, у вас должен быть ViewController в раскадровке с идентификатором TabbarViewController