UiSplitViewController segue приводит к тому, что Detail заменяет Master на левой стороне - PullRequest
0 голосов
/ 12 марта 2019

У меня проблема с переходом 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)
                    }
                }
            }
        }
    }
}

Что-то не так здесь, что я не вижу, или где-то еще я должен искать источник проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...