Переключение представлений ViewController

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