Как использовать делегаты между UIViewControllers? - PullRequest
0 голосов
/ 04 декабря 2018

Я уже искал:

Но не удалось найти ответ.В основном у меня есть два контроллера представления, и я пытаюсь использовать делегата для обновления массива и, в конечном итоге, для перезагрузки представления коллекции.

ViewController1

    class ViewController1: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, AppendDelegate {

    let cellID = "cell"

    var list = ["item1", "item2", "item3"]
    let otherView = ViewController2()

    override func viewDidLoad() {
        super.viewDidLoad()

        otherView.delegate = self
        print(list)

        let collection = UICollectionView(frame: view.bounds)
        collection.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellID)
        collection.delegate = self
        collection.dataSource = self
        collection.backgroundColor = UIColor.cyan

        view.backgroundColor = .white
        view.addSubview(collection)

        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(moveToOtherVC))
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 5
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath) as UICollectionViewCell
        cell.backgroundColor = UIColor.black
        return cell
    }

    func appendItem(string: String) {
        list.append(string)
        print(list)
    }

    @objc func moveToOtherVC() {
        let VC2 = UINavigationController(rootViewController: ViewController2())
        present(VC2, animated: true, completion: nil)
    }
}

Моя втораяконтроллер представления

    protocol AppendDelegate {
    func appendItem(string: String)
}

class ViewController2: UIViewController {

    var delegate: AppendDelegate?

    let textField: UITextField = {
        let tf = UITextField(frame: CGRect(x: 0, y: 0, width: 39, height: 20))
        tf.backgroundColor = .blue
        return tf
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        view.addSubview(textField)

        self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(sendDataToCollection))

        textField.center.x = view.center.x
        textField.center.y = view.center.y
    }

    @objc func sendDataToCollection() {
        guard let text = textField.text else {return}
        self.delegate?.appendItem(string: text)
        textField.text = ""
        moveToVC()
    }

    @objc func moveToVC() {
        dismiss(animated: true, completion: nil)
    }

}

Во втором классе разве не должен сам self.delegate.appendItem результат В ViewController1 при добавлении в список?

Я также использовал Центр уведомлений в качестве альтернативыделегатам, но не повезло.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Используйте функцию ViewController1 следующим образом:

  @objc func moveToOtherVC() {
     let otherView = 
     self.storyboard?.instantiateViewController(withIdentifier: 
     "ViewController2") as! ViewController2
     otherView.delegate = self                                
     self.present(next, animated: true, completion: nil)
   }
0 голосов
/ 04 декабря 2018

Вы делаете почти все правильно, но неправильно настраиваете делегата ViewController2.

На самом деле вы устанавливаете делегат нового экземпляра ViewController2 в viewDidLoad, но в moveToOtherVC вы представляете разные ViewController2 в качестве корня UINavigationController

Вместо этого установленоделегировать новый экземпляр ViewController2 и использовать этот экземпляр как rootViewController для представления navigationController

@objc func moveToOtherVC() {
    let vc2 = ViewController2()
    vc2.delegate = self
    let navigationController = UINavigationController(rootViewController: vc2)
    present(navigationController, animated: true, completion: nil)
}

, или вы можете решить свою проблему, просто передав otherView как rootViewController из navigationController

let navigationController = UINavigationController(rootViewController: otherView)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...