#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
.