У меня проблема с переходом UiSplitViewController на iPad.Реализация более или менее стандартна: начальный контроллер разделенного представления, который подключен к главному VC и подробному VC, каждый с предшествующими им контроллерами навигации.Проблема заключается в том, что при выборе элемента в главной таблице VC подробный VC заменяет главный VC на левой стороне разделенного представления вместо простого обновления VC на правой стороне.
Я пытался сравнить все, что могу, со свежим фиктивным приложением из шаблона приложения Master-Detail, созданного Xcode 10.1.Я не обнаружил каких-либо существенных различий и не могу понять, где еще искать источник проблемы.
Чтобы проиллюстрировать проблему:
Вот как выглядит нормальная начальная точка.
Вот плохой результат выбора представления таблицыitem.
Вот изображение выходной проводки.
В моем файле AppDelegate.swift основное отличие от шаблона состоит в том, что у меня есть специальныйкорпус для размещения модального входящего экрана при первом использовании:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let splitViewController = self.window!.rootViewController as! UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
splitViewController.delegate = self
if splitViewController.isCollapsed == false {
//if in splitView and portrait, force this VC to become visible
//So that MyNetworkVC runs and can trigger Onboarding
if splitViewController.displayMode == .primaryHidden {
splitViewController.preferredDisplayMode = .primaryOverlay //.allVisible
}
}
return true
}
[Snip ...]
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
guard let topAsDetailController = secondaryAsNavController.topViewController as? IntroDetailsVC else {
return false
}
if topAsDetailController.selectedContact == nil {
// Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return true
} else {
return false
}
}
И, наконец, в моем главном ВК:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "IntroDetails" {
if let indexPath = tableView.indexPathForSelectedRow {
let iDVC = (segue.destination as! UINavigationController).topViewController as! IntroDetailsVC
iDVC.selectedContact = fetchedResultsController.object(at: indexPath)
iDVC.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
iDVC.navigationItem.leftItemsSupplementBackButton = true
//set the default selection to the first item so split view has something to display
//FIXME: Save last selection to user defaults and bring it back when we re-appear
if iDVC.selectedContact == nil {
if let numRecords = fetchedResultsController.fetchedObjects?.count {
if numRecords > 0 {
let initialIndexPath = IndexPath(row: 0, section: 0)
iDVC.selectedContact = fetchedResultsController.object(at: initialIndexPath)
}
}
}
}
}
}
Что-то не так здесь, что я не вижу, или где-то еще я должен искать источник проблемы?