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

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

Проблема, с которой я столкнулся, заключается в том, что если я поверну устройство в подробном представлении, показанном выше, пока я нахожусь в подробном представлении, поворот правильно возвращается к splitView, однако теперь, когда я выбираю строку, метод делегата не обновляет подробный вид. Кажется, что это работает, только если я начинаю в splitView и остаюсь в этом представлении, или если я начинаю в свернутом представлении и остаюсь в нем. Если я повернусь, то метод делегата, похоже, не работает.
Я нашел предыдущий пост, в котором показано, как использовать метод делегата для обновления подробного представления с использованием целевого кода 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:
Я возился с этими методами, но до сих пор не смог заставить их работать, и я не нашел никаких сообщений, которые показывают примеры того, как они используются.
Спасибо.





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