viewDidLoad вызывается дважды, используя контроллер навигации - PullRequest
0 голосов
/ 19 ноября 2018

Мой ViewDidLoad метод на ViewController вызывается дважды, но только в определенном сценарии.Есть два контроллера представления, которые мне нужно представить, один, если пользователь не вошел в систему, и второй, если пользователь вошел в систему. Я использую раскадровку и установил контроллер навигации в качестве начального контроллера представления в нем.

В моем методе AppDelegate didFinishLaunchingWithOptions я заполнил массив ViewControllers требуемым контроллером, как показано ниже

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navigationController = storyboard.instantiateViewController(withIdentifier: "navController") as! UINavigationController
if UserDefaults.standard.object(forKey: USERID) != nil {
    viewController = storyboard.instantiateViewController(withIdentifier: "HomeVC_ID") as! HomeVC
} 
else {
    viewController = storyboard.instantiateViewController(withIdentifier: "LoginVC_ID") as! LoginVC
}
navigationController.viewControllers = [viewController] as! [UIViewController]
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()

ViewDidLoad метод в HomeVC вызывается дважды, тогда какон вызывается только один раз для LoginVC.

Я уже пытался искать по статьям viewDidLoad вызывается дважды и viewDidLoad вызывается дважды на rootViewController при запуске , но не можетзагнать проблему в угол.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я бы порекомендовал не делать никаких ручных переходов ИЛИ загружать контроллер представления в делегате приложения. Используйте следующий фрагмент кода в viewDidLoad для LoginView (надеясь, что это всегда корневое представление вашего приложения).

Используйте segue для входа в систему homeview.

if UserDefaults.standard.object(forKey: USERID) != nil {
     self.performSegue(withIdentifier: "HomeViewIdentifier", sender: self)
}

Учитывая, что HomeViewIdentifier является segueId для LoginView до HomeView. Почему я предлагаю это, потому что вам нужно вернуться к loginView, когда пользователь выходит из системы. Если вы сделаете homeView как rootview, то куда вы пойдете в случае выхода из системы.

0 голосов
/ 19 ноября 2018

Когда вы создаете свой контроллер вида навигации из раскадровки, он уже содержит его rootViewController (что не следует путать с rootViewController из UIWindow).Я думаю, это ваше HomeVC (в раскадровке).Итак, магия раскадровки уже создает HomeVC, и вам не нужно создавать ее вручную в didFinishLaunchingWithOptions.

Если вы указали раскадровку в качестве основного интерфейса в свойствах проекта / цели, вы делаетене нужно никакого творческого кода в didFinishLaunchingWithOptions и просто позвольте фреймворку творить чудеса.

Если вы хотите сделать это программно, то - в раскадровке - вы должны удалить контроллер навигации и создать его вручную (не через instantiateViewController) в didFinishLaunchingWithOptions.Здесь вы также добавили бы соответствующий контроллер корневого представления (созданный из раскадровки), возможно, так:

let storyboard = UIStoryboard(name: "Main", bundle: nil)

if UserDefaults.standard.object(forKey: USERID) != nil {
    viewController = storyboard.instantiateViewController(withIdentifier: "HomeVC_ID") as! HomeVC
} else {
    viewController = storyboard.instantiateViewController(withIdentifier: "LoginVC_ID") as! LoginVC
}
let navigationController = UINavigationController(rootViewController:viewController)
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
...