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

Я создал проект Master-Detail полностью программно, то есть никакой раскадровки (я удалил файлы).

Чего я не могу понять, так это того, как перейти между основным представлением (MV) и подробным представлением (DV)

я пробовал

self.showViewController(detailViewController, sender: self)

а также

self.showDetailViewController(detailViewController, sender: self)

из MV, но на самом деле это не работает.

Таблица моего MV заполнена ячейками, которые при нажатии должны приближаться к аннотации в mapView в моем DV.

По какой-то причине карта на DV и таблица в MV не обновляются после первой загрузки при открытии приложения.

Я использую пользовательский объект для передачи данных между представлениями

MV:

    detailViewController.setRequired(self.customObject)

    self.showDetailViewController(detailViewController, sender: self)

    self.tableView.reloadData()

Где «setRequired» — это функция, которая устанавливает переменные класса DV в обновленные значения из MV (эта часть, по крайней мере, работает)

DV:

super.viewDidLoad()

    mapView = MKMapView()
    mapView.mapType = .Standard
    mapView.frame = view.frame
    mapView.delegate = self
    view.addSubview(mapView)

    self.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
    self.navigationItem.leftItemsSupplementBackButton = true

    populateMap(extractedObject)

где «populateMap» — это функция, которая принимает объект (значения правильные, не беспокойтесь) и предназначена для заполнения карты новой информацией.

Как я уже сказал, mapView не обновляется, и таблица тоже.

Есть идеи?

(напоминаем, что файла раскадровки нет, конечно, намеренно)

Заранее спасибо!

Йона

ИЗМЕНИТЬ

После ответа вакавамы:

Да, мой masterViewController встроен в UINavigationController. в viewDidLoad MVC у меня есть

let controllers = self.splitViewController!.viewControllers
self.detailViewController =  controllers[controllers.count-1].topViewController as DetailViewController}, 

но когда я пытаюсь предложить self.navigationController.pushView..., я получаю следующую ошибку:

fatal error: unexpectedly found nil while unwrapping an Optional value

на линии let controllers = ...

EDIT в Edit

Даже после решения проблемы с найденным нулем карта и таблица просто не загружаются. Есть идеи?


person Jona    schedule 23.06.2015    source источник
comment
Вы раньше не упоминали SplitViewControllers. Я дал вам ответ для iPhone. Для SplitViewController и Master, и Detail отображаются на экране одновременно, поэтому загрузка новых ViewController не требуется (что и делает переход). Просто запишите данные, которые необходимо отправить в detailViewController, в свойство или свойства, а затем вызовите метод, чтобы DetailViewController обновил свое представление. Вы даже можете сделать это автоматически, используя didSet для свойства в detailVC.   -  person vacawama    schedule 23.06.2015
comment
Спасибо. Это может быть важно: у меня есть кнопка в верхней части моего MVC, которая после нажатия открывает всплывающее окно. Вы выбираете некоторые вещи в этом всплывающем окне, а затем нажимаете «Обновить» — это должно использовать выбранную информацию из всплывающего окна и соответственно обновлять MVC и DVC. Есть ли какой-то особый способ перехода от всплывающего окна к раздельному представлению? Прямо сейчас все, что я делаю, это self.dismissViewController(true, nil) в конце кода всплывающего окна. Спасибо еще раз   -  person Jona    schedule 23.06.2015
comment
Я думаю, что нормально вызвать self.dismissViewController, чтобы закрыть всплывающее окно. Я предполагаю, что перед тем, как вы это сделаете, вы отправляете данные обратно вызывающему абоненту.   -  person vacawama    schedule 23.06.2015
comment
Да, использую let mcv = MasterViewController(), а затем имя mvc.function (данные). но карта и таблица не меняются. Однако, если я представляю ViewController(mvc), правильно обновленная таблица всплывает и закрывает экран. Так может мне нужно что-то подобное? Спасибо еще раз   -  person Jona    schedule 23.06.2015


Ответы (1)


Segues — это создание раскадровки. Если у вас нет раскадровки, вы не можете перейти. Если ваш masterViewController встроен в UINavigationController, программный способ перехода к detailViewController:

self.navigationController.pushViewController(detailViewController, animated: true)

Если ваш masterViewController не встроен в UINavigationController, вы можете представить detailViewController модально:

self.presentViewController(detailViewController, animated: true, completion: nil)

Обновление:

В обновленном вопросе вы упомянули SplitViewController. Мой первоначальный ответ дал вам информацию для iPhone. Для SplitViewController и Master, и Detail отображаются на экране одновременно, поэтому загрузка новых ViewController не требуется (что и делает переход). Просто запишите данные, которые вам нужно отправить в detailViewController, в свойство или свойства, а затем вызовите метод, чтобы detailViewController обновил его представление. Вы даже можете сделать это автоматически, используя didSet для свойства в detailViewController.

Обратите внимание, что viewDidLoad не запустится при обновлении файла detailViewController. Вам нужно извлечь код, который обновляет пользовательский интерфейс файла detailViewController. Назовите это что-то вроде updateUI. Затем позвоните updateUI как из viewDidLoad, так и когда ваши данные будут обновлены. Я предлагаю реализовать didSet в вашем свойстве customData и вызывать updateUI оттуда.

person vacawama    schedule 23.06.2015
comment
Да, большое спасибо! Я заснул, отсюда и задержка - person Jona; 24.06.2015