Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в Swift? - PullRequest
0 голосов
/ 23 ноября 2018

Я использую splitViewController для отображения основного вида и подробного вида.

enter image description here

Когда я нажимаю на строку, подробный видобновляется корректно.

Затем, когда я нахожусь в книжной ориентации, я сворачиваю подробное представление разделенного просмотра, чтобы элементы основного списка отображались следующим образом: enter image description here

И когда я нажимаю на строку, я правильно перехожу к подробному виду, как показано: enter image description here

Проблема, с которой я сталкиваюсь, заключается в том, что если я поверну устройство вв подробном представлении, показанном выше, пока я нахожусь в подробном представлении, вращение корректно возвращается к splitView, однако теперь, когда я выбираю строку, метод делегата не обновляет подробное представление.Кажется, это работает, только если я начинаю в splitView и остаюсь в этом виде, или если я начинаю в свернутом виде и остаюсь в этом.Если я поверну, то метод делегата, похоже, не будет работать.

enter image description here

Я обнаружил предыдущую статью, в которой показано, как использовать метод делегата дляобновите подробный вид, используя целевой код C, используя функцию didSelectRow.Я попытался продублировать этот код следующим быстрым кодом:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let navigationVC = UINavigationController()
    var detailVC = TestsDetailAdvertVC()

    if let tests = controller.fetchedObjects, tests.count > 0 {
        //if there is, keep track of the test which is selected
        selectedTest = tests[indexPath.row]

        if let isCollapsed = splitViewController?.isCollapsed {
            if isCollapsed {
                //solves problem of navigating to the detail view in compact view
                // on the iPhone (compact) the split view controller is collapsed
                // therefore we need to create the navigation controller and detail controller
                detailVC = self.storyboard!.instantiateViewController(withIdentifier: "detailVC") as! TestsDetailAdvertVC
                navigationVC.setViewControllers([detailVC], animated: false)
                self.splitViewController?.showDetailViewController(detailVC, sender: self)
                detailVC.testToEdit = selectedTest

            } else {
                // if the split view controller shows the detail view already there is no need to create the controllers
                // so we just pass the correct test using the delegate
                // if the test variable is set, then it calls the showDetail function

              delegate?.testToEdit = selectedTest
            }

        }
    }
}

Я думаю, что каким-то образом, когда тот или иной метод используется для обновления подробного представления, он работает, но затем, когда он переключается назад и впередперестает работать.Интересно, решил ли кто-нибудь эту проблему, используя быстрый код, который мог бы привести меня к примеру.

Примечание: После некоторого дополнительного поиска я понял, что есть несколько методов делегата для splitViewController, включая:

func primaryViewControllerForExpandingSplitViewController:

и

func primaryViewControllerForCollapsingSplitViewController:

и

splitViewontroller 10Control_Controllerвозиться с этими методами, но до сих пор не смог заставить их работать, и я не нашел ни одного поста, который показывает примеры их использования.

Спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Я выяснил, как правильно обновлять подробный вид, используя ответ из предыдущего поста по адресу:

В UISplitViewController не удается сделать showDetailViewController: sender: нажать на detail navigationController

мой код для решения проблемы обновляется с использованием кода swift:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    var detail = UINavigationController()
    var testVC = TestsDetailAdvertVC()

    if let tests = controller.fetchedObjects, tests.count > 0 {
        //if there is, keep track of the test which is selected
        selectedTest = tests[indexPath.row]

        if let isCollapsed = splitViewController?.isCollapsed {
            if isCollapsed {
                //in collapsed view, the correct detail view controller is not
                //yet substantiated, so we need to substantiate it
                testVC = self.storyboard?.instantiateViewController(withIdentifier: "detailVC") as! TestsDetailAdvertVC
                detail.setViewControllers([testVC], animated: true)
                testVC.testToEdit = selectedTest

            } else {
                //in expanded view, the correct view controller needs
                //to be identified, using the appropriate view controller for
                //the splitview controller
                let vc = self.splitViewController?.viewControllers[1]
                //which is a navigation controller
                if vc is UINavigationController {
                    detail = vc as! UINavigationController
                    //which we then use to identify the correct detail view
                    testVC = detail.viewControllers.first as! TestsDetailAdvertVC
                    testVC.testToEdit = selectedTest
                }
            }
        }
    }
    self.splitViewController?.showDetailViewController(detail, sender: self)
}

Ключевое решение заключается в том, что в свернутом контроллере splitview должен создаваться подробный вид из раскадровки.Однако в расширенном контроллере splitview подробный вид должен исходить из расширенного контроллера навигации.Затем, когда я поворачиваю правильные детали, контроллер корректно обновляется.

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