Как передавать данные между представлениями, используя шаблон Swift Delegate - PullRequest
0 голосов
/ 21 марта 2020

Я студент, изучающий iOS Мы осуществляем передачу данных между представлениями с помощью Delegate.

Но я не понимаю, почему данные не передаются.

Какая часть должна Я исправляю?

И я не хочу использовать segue.

Великие разработчики, поделитесь своими знаниями!

Я хочу отправить данные из LoginV C в ShowCompanyV C.

//LoginVC Source...
import UIKit

protocol DataDelegate: class {
    func sendData(data: String)
}

class LoginVC: UIViewController {

    @IBOutlet weak var bizNumTF: UITextField!

    weak var delegate: DataDelegate?

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func LoginButton(_ sender: UIButton) {
        delegate?.sendData(data: "Data")
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
        self.present(vc, animated: true, completion: nil)
    }}

}

ShowCompanyV C Источник ...

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

    @IBOutlet weak var testLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func sendData(data: String) {
        print(data)
        testLabel.text = data
    }
}

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Прежде всего, ваши самые большие проблемы в том, что ваш "self.delegate" равен нулю по двум причинам:

  1. вы не присвоили его никому, поэтому ваш параметр "делегат" остается нулевым .

  2. "ShowCompanyV C" создается после забавы делегата c "sendData", что означает, что вы упустили свой шанс назначить своего делегата.

Я бы не стал прибегать к использованию делегирования в этом случае, и я предлагаю вам больше взглянуть на делегатов / делегирование, как предложил @Glenn.

Я бы, вероятно, решил вашу проблему гораздо проще:

class LoginVC: UIViewController {

@IBOutlet weak var bizNumTF: UITextField!


override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func LoginButton(_ sender: UIButton) {
    guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
    vc.data = "Data"
    self.present(vc, animated: true, completion: nil)
}}

}

import UIKit

class ShowCompanyVC: UIViewController, DataDelegate {

//MARK: - IBOutlets

@IBOutlet weak var testLabel: UILabel!

//MARK: - Properties

var data: AnyObject?

override func viewDidLoad() {
    super.viewDidLoad()
    if let data = data as? String {
        self.sendData(data: data)
    }
}

func sendData(data: String) {

    print(data)
    testLabel.text = data
}

}

0 голосов
/ 21 марта 2020

В этом случае вам действительно не нужен делегат.

Вы можете отправлять любые данные непосредственно после создания экземпляра контроллера ShowCompanyV C.

class ShowCompanyVC: UIViewController, DataDelegate {

   var dataToBeReceived: String? // insert here the data type you expect to receive
   ...
}

class LoginVC: UIViewController {

    @IBAction func LoginButton(_ sender: UIButton) {
        guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ShowCompanyVC") as? ShowCompanyVC else { return }
        vc.dataToBeReceived = "any data"
        self.present(vc, animated: true, completion: nil)
    }}

}

Вам потребуется делегировать, если вы хотите отправить данные обратно в контроллер представления входа в систему с контроллера ShowCompanyV C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...