Как установить флаг и передать некоторые значения из всплывающего видового контроллера текущей модели на вкладку «Главный видовой контроллер» с помощью Swift 4.2? - PullRequest
0 голосов
/ 20 февраля 2019

Мой сценарий, у меня Tabbar с тремя viewcontroller.Здесь сначала вкладка viewcontroller Я показываю tableview.Если я щелкну ячейку таблицы, она покажет одну всплывающую текущую модель viewcontroller.В этом всплывающем окне viewcontroller я поддерживаю две кнопки отмены и готово.Если я нажму на кнопку «Готово», он будет отклонен и покажет tabbar контроллер основного вида.В то время как dismiss время мне нужно передать некоторые значения с флагом кнопки из текущего всплывающего контроллера просмотра на основной вид контроллера панели вкладок.

Здесь, под моим разрешением popup проход кода контроллера представления (VC 2)

@IBAction func apply_click(_ sender: Any) {
        print("Dimiss Filter")
        dismiss(animated: true, completion: {

            if let navView = self.tabBar?.viewControllers?[0] as? UINavigationController {
                if let secondTab = navView.viewControllers[0] as? HomeViewController {
                    secondTab.selectedIndexFromFirstTab = self.selectedIndex
                    //secondTab.item = self.item
                    secondTab.tfData = "YES"
                }
            }
            self.tabBar?.selectedIndex = 0
        })
    }

Здесь Tabbar контроллер основного вида code (получение значений) (VC 1)

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        print("SELECTED INDEX:\(selectedIndexFromFirstTab)")
        print("RESPONSE:\(tfData)")
    }

Я не получаю значения, как решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Из моего предыдущего ответа вам нужно внести несколько изменений в существующий код, если вы хотите передать значения из дочернего представления в контроллер панели вкладок.

Для этого прежде всего вамнеобходимо объявить метод в вашем основном TabBarViewController

func tabPressedWithIndex(index: Int, valueToPass: String) {
    print("selected Index: \(index)")
    print("Value from user: \(valueToPass)")
}

Теперь вам нужно передать этот контроллер панели вкладок в детальное представление с помощью метода didSelectRowAt, и он будет выглядеть следующим образом:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
    vc.selectedIndex = indexPath.row
    vc.tabBar = self.tabBarController as? TabBarViewController  // Here you need to assign tab bar controller.
    self.present(vc, animated: true, completion: nil)
}

Теперь следующее - когда вы нажимаете кнопку «отклонить» в контроллере подробного представления, вам нужно добавить одну строку ниже self.tabBar?.selectedIndex = 1:

self.tabBar?.tabPressedWithIndex(index: 1, valueToPass: self.userTF.text!)

Теперь это передаст значения контроллеру и методу панели вкладок.tabPressedWithIndex позвонит и распечатает ваши данные на главной вкладке.

Проверьте проект demo для получения дополнительной информации.

0 голосов
/ 20 февраля 2019

Это решение

self.dismiss(animated: true) {
            if let tabController = self.presentingViewController as? UITabBarController {
                if let navController = tabController.selectedViewController as? UINavigationController {
                    if let secondTab = navController.viewControllers.first as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                } else {
                    if let secondTab = tabController.selectedViewController as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                }
            }
        }
0 голосов
/ 20 февраля 2019

Вы можете достичь этого несколькими способами.Использование блоков / замыканий, протоколов или, если вы используете RxSwift, чем использование управляемого свойства или использование контролируемых событий.Поскольку я не могу продемонстрировать все здесь, я собираюсь написать протокол

Используя протокол

Шаг 1:

Объявить протоколв вашем контроллере модального вида

@objc protocol ModalViewControllerProtocol {
    func dismiss(with data: String)
}

Шаг 2:

ViewController, который представляет этот ModalViewController, делает его для подтверждения протокола

extension HomeViewController: ModalViewControllerProtocol {
    func dismiss(with data: String) {
        //use the data here
        self.presentedViewController?.dismiss(animated: true, completion: nil)
    }
}

Шаг 3:

Объявление переменной для хранения ссылки на делегат в ModalViewController

weak var delegate: ModalViewControllerProtocol? = nil

Шаг 4:

ВВаш ViewCOntroller, который представляет modalViewController, передает себя в качестве делегата ModalViewController перед представлением

    let modalVC = //...
    modalVC.delegate = self
    self.present(modalVC, animated: true, completion: nil)

Наконец, в IBAction ModalViewController просто вызовите

@IBAction func apply_click(_ sender: Any) {
    self.delegate?.dismiss(with: "your_data_here")
}

Использование блокировки / закрытия

Шаг 1:

В вашем модальном ViewController объявите свойство, которое принимает блокировку / закрытие

var completionBlock: (((String) -> ()))? = nil

Шаг 2:

В вашем ViewController, который представляет этот ModalViewController, передайте блок перед

    let modalVC = //...
    modalVC.completionBlock = {(data) in
        debugPrint(data)
        self.presentedViewController?.dismiss(animated: true, completion: nil)
    }
    self.present(modalVC, animated: true, completion: nil)

Шаг 3:

Наконец, в вашем ModalViewController IBAction просто выполните переданный блок

    if let block = completionBlock {
        block("your data here")
    }

Надеюсь, это поможет

...