#ios #uiviewcontroller #swift3 #uistoryboardsegue #uicontainerview
#iOS #uiviewcontroller #swift3 #uistoryboardsegue #uicontainerview
Вопрос:
Я изучаю iOS с несколькими примерами проектов. У меня есть два контроллера просмотра, в которых первый VC имеет несколько кнопок и mapview, а второй VC имеет tableview, показывающий набор результатов. Я встроил оба viewcontrollers в navigationViewController.Нажав кнопку из первого VC, я могу показать tableview (используя show segue) и вернуться к первому VC с помощью навигации. Теперь мой запрос заключается в том, что я хочу отобразить tableview (второй VC) вместо одного объекта просмотра (вид карты), определенного в firstVC, а не заполнять tableview полностью в полноэкранном режиме. Моя проблема в том, что при показе другого Viewcontroller я все еще хочу видеть несколько viewobjects из firstVC, поэтому я пытаюсь отобразить secondVC поверх mapview, когда нажимаю на кнопку, которая запускает переход.Я должен использовать единый интерфейс, поэтому мне нужно загрузить результаты tablview из SecondVC в firstVC, заменив представление MapView на tableview.Пожалуйста, дайте мне знать ваши идеи, если это возможно, и любые другие идеи для достижения того же самого приветствуются.
Ответ №1:
Срикант Гундлапалли,
Все, что вам нужно сделать, это добавить представление контроллера TableView в качестве подвида к вашему контроллеру представления. Чтобы упростить процесс, я лично предпочитаю использовать containerView,
Шаг 1: Добавьте containerView в свой контроллер представления и добавьте к нему ограничения автоматической компоновки, поскольку ваш TableView будет загружен внутри этого представления контейнера, которое вы пожертвуете, необходимо применить любое ограничение автоматической компоновки к вашему TableView, чтобы сохранить его на месте 🙂
Шаг 2. Перетащите IBOutlet в представление контейнера.давайте назовем это как containerView 🙂
Шаг 3: теперь вам нужно иметь два контроллера представления 1 для загрузки карты и 1 для загрузки TableView, или у вас будет представление карты в качестве подвида контроллера представления, и вы либо скроете его, либо удалите и добавите представление контейнера, но я лично предпочитаю иметь чистый и аккуратный код, поэтому я предпочитаю иметьдва разных VCS
итак, давайте создадим 2 VCS, назовем их как viewController1 и ViewController2 Savy??
Шаг 4: давайте напишем метод, который фактически загружает VC и добавляет его представление в качестве подвида в ваш ViewController
func changeEmbededVC(for status : Int) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if status == 0 {
mehereButton.tag = 1
let vc = storyboard.instantiateViewController(withIdentifier: "viewController1")
vc.willMove(toParentViewController: self)
containerView.addSubview(vc.view)
self.addChildViewController(vc)
vc.didMove(toParentViewController: self)
}
else {
mehereButton.tag = 0
let vc = storyboard.instantiateViewController(withIdentifier: "viewController2")
vc.willMove(toParentViewController: self)
containerView.addSubview(vc.view)
self.addChildViewController(vc)
vc.didMove(toParentViewController: self)
}
}
Я считаю, что код довольно понятен: D теперь что такое mehereButton.tag = 1
?? Просто вы хотите переключать просмотр при нажатии кнопки, не так ли: D поэтому я создал IBOutlet для mehereButton и изменил его тег 🙂
теперь, наконец, в IBAction mehereButton
@IBAction func buttonTapped(_ sender: UIButton) {
self.changeEmbededVC(for: self.mehereButton.tag)
}
но нам нужно загрузить одно из представлений по умолчанию, не так ли: D
поэтому измените viewDidAppear на
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.changeEmbededVC(for: 0)
}
Надеюсь, я подробно ответил на ваш вопрос: P Я знаю, что вы не можете ни проголосовать, ни принять ответ, поскольку у вас недостаточно репутации 🙂 но надеюсь, что это поможет кому-то и в будущем 🙂
Комментарии:
1. Во-первых, спасибо за ваш ответ. Я застрял в его реализации, не могли бы вы рассказать мне несколько руководящих указаний, как переключать представление mapview с помощью tableview при нажатии кнопки без использования двух viewcontrollers отдельно.
2. вы можете добавить вид карты и применить к нему ограничения автоматической компоновки, а затем добавить TableView поверх MapView и применить к нему ограничение автоматической компоновки, а затем иметь два IBOutlets, один для TableView и один для MapView, и при нажатии кнопки на основе значения тега скрыть таблицу или вид карты соответственно 🙂 вот и всеприятель 🙂
3. Сандип, ценю твой довольно быстрый ответ. Я думаю, будет лучше, если я расскажу вам о том, что я пытаюсь реализовать. как я и говорил в своем первом VC, у меня есть несколько объектов просмотра, и один из них — mapview. У меня есть веб-сервис, который я вызываю каждый раз с указанием местоположения в качестве параметра, который я даю, и он возвращает несколько результатов, которые представляют собой набор местоположений, с помощью которых я делаю аннотации и показываю то же самое на карте. поскольку у меня есть выход на карту в моем FirstVC, я могу ссылаться на нее и делать все, что захочу. Если я использую представление контейнера, я могу загрузить в него дочерний вид (MapView), но как получить от него отдушину.
4. К вашему сведению, у меня такая же реализация в моем mapviewhttps: //www.raywenderlich.com/90971/введение-mapkit-swift-tutorial
5. Наконец, возможность переключать представления, используя вашу идею скрытия соответствующего представления и отображения другого представления, наоборот, на основе значения тега кнопки, как вы указали. Огромное спасибо Сандипу :).