У меня есть то, что кажется очень распространенной настройкой в моем универсальном приложении, с корнем UISplitViewController
, использующим UITabBarController
в качестве masterViewController
, и затем я хочу:
- либо поместите контроллер подробного просмотра в стек, если я нахожусь на вертикальном iPhone
- покажите подробный контроллер в detailViewController
UISplitViewController
на iPhone 6+ lanscape и других больших экранах, таких как iPad и т.п.
Для этого у меня точно такая же настройка, как и во всех тех обсуждениях, в которых упоминается похожая проблема:
Но ни одно из решений, упомянутых в этих вопросах, не работает.Некоторые из них создают бесконечный рекурсивный цикл и EXC_BAD_ACCESS
.И последний, который я попробовал, просто продолжает представлять контроллер детального представления модально, а не помещать его в стек на iPhone.Я создал собственный подкласс UISplitViewController
следующим образом:
class RootSplitViewController: UISplitViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self
}
}
extension RootSplitViewController: UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, showDetail vc: UIViewController, sender: Any?) -> Bool {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if(splitViewController.traitCollection.horizontalSizeClass == .compact) {
tabController.selectedViewController?.show(vc, sender: sender)
} else {
splitViewController.viewControllers = [tabController, vc]
}
}
return true
}
func splitViewController(_ splitViewController: UISplitViewController, separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? {
if let tabController = splitViewController.viewControllers[0] as? UITabBarController {
if let navController = tabController.selectedViewController as? UINavigationController {
return navController.popViewController(animated: false)
} else {
return nil
}
} else {
return nil
}
}
}
А вот код в главном контроллере представления для отображения контроллера подробного представления:
self.performSegue(withIdentifier: "showReference", sender: ["tags": tags, "reference": reference])
Гдеtags
и reference
, где загружены из Firebase.И, конечно, sege showReference имеет вид «Show Detail (например, Replace)».
Первый метод делегата вызывается правильно, о чем свидетельствует точка останова, которая попадает туда, когда я щелкаю элемент всписок внутри UITabBarController
.И все же контроллер подробного представления все еще представлен модально на iPhone.Однако на iPad проблем нет: контроллер детального просмотра отображается справа, как и ожидалось.
Большинство упомянутых выше ответов довольно старые, и некоторые решения реализованы в Objective-C, поэтому, возможно, я сделал что-то не такв преобразовании, или что-то изменилось в реализации UISplitViewController
с тех пор.
У кого-нибудь есть предложения?