Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в быстром режиме?

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

Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в быстром режиме?

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

Затем, когда я нахожусь в портретном представлении, я сворачиваю подробное представление разделенного просмотра, чтобы элементы этого главного списка отображались следующим образом: Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в быстром режиме?

И когда я нажимаю на строку, я правильно перехожу к подробному представлению, как показано: Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в быстром режиме?

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

Как правильно использовать didSelectRowAt в splitViewController на компактном устройстве в быстром режиме?

Я нашел предыдущий пост, в котором показано, как использовать метод делегата для обновления подробного представления с использованием целевого кода 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:

и

splitViewController: отдельныйSecondaryViewControllerFromPrimaryViewController:

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

Спасибо.

Попробуйте шаблон приложения Xcode Master Detail и посмотрите, как он работает, внимательно посмотрите на раскадровку, чтобы узнать, как использовать адаптивные переходы. Нет необходимости проверять свернутое состояние, все происходит автоматически.

malhal 10.01.2019 01:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
652
1

Ответы 1

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

В UISplitViewController невозможно сделать showDetailViewController: sender: push to detail navigationController

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

    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 подробное представление должно поступать из расширенного контроллера навигации. Затем, когда я поворачиваю правильный подробный вид, контроллер обновляется правильно.

Другие вопросы по теме