Передача данных между не связанными ViewControllers - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь реализовать экран входа в систему, который бы помещал данные в контроллер представления, контроллер представления входа в систему вызывается путем переопределения метода didBelect tabBarController, следующим образом:

enter image description here

Обратите внимание, что между TabBarController и ThirdViewController нет никакого перехода, потому что я перезаписываю tabBarController следующим образом:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate {

// This delegate open the modal view after open the desired view.
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController is MyThirdViewController {
            if let loginPopupVC = tabBarController.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") {
                tabBarController.present(loginPopupVC, animated: true)
            }
        }
    }
}

Теперь в моем LoginViewController я анализирую JSON в структуре (LoginResponse) с данными, которые должны заполнять ThirdViewController (имя, фамилия, пол, рождение и т. Д.). Я уже делаю это с этим фрагментом внутри LoginViewController:

struct LoginResponse : Decodable {
    var name: String
    var surname: String
    var sex: String
    var birth: String
}

class LoginViewController: UIViewController, UITextFieldDelegate, XMLParserDelegate {

@IBAction func cancelLogin(_ sender: UIButton) {
        //LoginViewController will close and ThirdViewController will open
        dismiss(animated: true, completion: nil)
    }

@IBAction func makeLogin(_ sender: UIButton) {
        //LoginViewController brings data, closing itself and opening ThirdViewController
        self.updateUI()
        self.dismiss(animated: true, completion: nil)
    }

func updateUI() {
        do {
            let jsonDecoder = JSONDecoder()
            let myjson = "{\"name\": \"MyName\", \"surname\": \"MySurname\", \"sex\": \"Male\", \"birth\": \"1980-05-15\"}"
            let loginResult = try jsonDecoder.decode(LoginResponse.self, from: Data(myjson.utf8))
        }
        catch let jsonErr{
            print(jsonErr)
        }

    }
}

Теперь я хочу передать эти данные (внутри loginResult) в ThirdViewController.

Я полагаю, что я не могу вызвать ThirdViewController из LoginViewController, потому что TabBarController уже сделал это, и что это необходимо, если я выбираю передачу данных с использованием метода Delegate или метода NotificationCenter.

Я хочу знать, какой из параметров передачи данных между ViewControllers будет работать лучше в этом случае, потому что обычно эти методы объясняются в примерах с двумя контроллерами представления, соединенными последовательностью, но в моем случае поток экранов необычно. Благодаря.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы можете попробовать что-то вроде этого:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate {

    // This delegate open the modal view after open the desired view.
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController is MyThirdViewController {
            if let loginPopupVC = tabBarController.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") {
                loginPopupVC.delegate = tabBarController
                tabBarController.present(loginPopupVC, animated: true)
            }
        }
    }
}

Для loginPopupVC:

struct LoginResponse : Decodable {
    var name: String
    var surname: String
    var sex: String
    var birth: String
}

class LoginViewController: UIViewController, UITextFieldDelegate, XMLParserDelegate {

    var delegate: loginDelegate?

    @IBAction func cancelLogin(_ sender: UIButton) {
        //LoginViewController will close and ThirdViewController will open
        dismiss(animated: true, completion: nil)
    }

    @IBAction func makeLogin(_ sender: UIButton) {
        //LoginViewController brings data, closing itself and opening ThirdViewController
        self.updateUI()
        self.dismiss(animated: true, completion: nil)
    }

    func updateUI() {
        do {
            let jsonDecoder = JSONDecoder()
            let myjson = "{\"name\": \"MyName\", \"surname\": \"MySurname\", \"sex\": \"Male\", \"birth\": \"1980-05-15\"}"
            let loginResult = try jsonDecoder.decode(LoginResponse.self, from: Data(myjson.utf8))
            // Pass data using delegate
            delegate?.handleLogin(with: loginResult)

        }
        catch let jsonErr{
            print(jsonErr)
        }

    }
}

А затем для вашего класса tabBarController:

protocol loginDelegate: class {
    func handleLogin(with object: LoginResponse)
}

class myTabBarController: UITabBarController, loginDelegate {

    // regular tabBarController lifecycle methods

    func handleLogin(with object: LoginResponse) {
        // do work with data
    }

}
0 голосов
/ 16 ноября 2018

правый.Я хотел бы предложить объявить переменную в loginPopupVC, которая будет содержать ссылку на ThirdViewController, поэтому в tabBar: didSelect после создания экземпляра loginVC вы передаете ей ссылку на ThirdVC, но перед представлением имени входа.В Login указанная переменная является уровнем класса, поэтому вы можете получить к ней доступ через функцию updateUI.Теперь объявите метод или переменную в ThirdView для хранения json и просто передайте его.

...