«Использование неразрешенного идентификатора «RootViewController» ошибки при идентификации и загрузке контроллеров представления в делегате приложения

#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