Присутствующий контроллер просмотра не всегда работает

#swift #xcode #storyboard

Вопрос:

У меня возникли некоторые проблемы с отображением контроллера просмотра в моем приложении IOS. Иногда это работает, и отображается представление, но иногда, и я думаю, когда контекст немного отличается, это не сработает. В отладчике нет ошибок или предупреждений, и он может найти ViewController из основной раскадровки (по крайней мере, это не ноль) Это используется для работы с собой.настоящее, но это, кажется, больше не работает.

 @IBAction func showHistoryButton(_ sender: MDCButton) {  let exercisesHistoryVC = ExercisesHistoryViewController.instantiate(from: .Main)  exercisesHistoryVC.modalPresentationStyle = .fullScreen  let appDeligate = UIApplication.shared.delegate as! AppDelegate  appDeligate.window?.rootViewController!.present(exercisesHistoryVC,animated: true,completion: nil)  // parent?.present(exercisesHistoryVC, animated: true, completion: nil)  }   

Комментарии:

1. Может быть, так и должно быть self.present ?

2. Это не сработает, если контроллер представления уже что-то представляет. Я бы начал с проверки иерархии представлений в тот момент, когда презентация не работает.

3. Это действительно уже экран 3e в иерархии, так что это может быть проблемой. Можно ли всегда представлять этот viewcontroller поверх всего ?

Ответ №1:

Используйте код,как показано ниже, представляя новый контроллер представления

 @IBAction func showHistoryButton(_ sender: MDCButton) {  let exercisesHistoryVC = ExercisesHistoryViewController.instantiate(from: .Main)  exercisesHistoryVC.modalPresentationStyle = .fullScreen  UIApplication.topViewController()?.present(exercisesHistoryVC, animated: false, completion: nil)  }  extension UIApplication {    static func topViewController(base: UIViewController? = UIApplication.shared.delegate?.window??.rootViewController) -gt; UIViewController? {  if let nav = base as? UINavigationController {  return topViewController(base: nav.visibleViewController)  }  if let tab = base as? UITabBarController, let selected = tab.selectedViewController {  return topViewController(base: selected)  }  if let presented = base?.presentedViewController {  return topViewController(base: presented)  }  return base  }   }  

Комментарии:

1. @mistert69,Проверь и дай мне знать

2. Да, теперь это работает идеально ! Большое спасибо, я пытался исправить это уже больше одного дня.

3. Вам нужно только if let presented = base?.presentedViewController { return topViewController(base: presented) } return base .