Шаблон делегирования в Swift 4 не работает! Может кто-нибудь объяснить правильный шаблон делегата в Swift 4? - PullRequest
0 голосов
/ 01 мая 2018

Почему этот шаблон делегата не работает? После выбора кнопки в DelegateViewController я хочу показать свойство name во втором ViewController (выход метки)

Я сделал следующие шаги:

  1. Создание протокола в "Boss" ViewController -> DelegateViewController

  2. Назначить мою функцию этому протоколу -> selectedButton

  3. Создать переменную selectionButtonDelegate в DelegateViewController
  4. В ViewController я создал новый экземпляр DelegateViewController ()
  5. В viewDidLoad я назначил делегат экземпляра равным себе
  6. Я создал расширение с функцией для передачи параметра

DelegateViewController:

import UIKit

protocol SelectionDelegate {
    func selectedButton(name: String)
}

class DelegateViewController: UIViewController {
    var selectionButtonDelegate: SelectionDelegate!

    @IBAction func bayernButton(_ sender: UIButton) {
        selectionButtonDelegate.selectedButton(name: "Bayern")
    }

    @IBAction func dortmundButton(_ sender: UIButton) {
        selectionButtonDelegate.selectedButton(name: "Dortmund")

    }
}

ViewController:

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var selectedButton: UILabel!

    let model = DelegateViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        model.selectionButtonDelegate = self
    }
}

extension ViewController: SelectionDelegate {
    func selectedButton(name: String) {
        selectedButton.text = name

    }
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Ваша реализация выглядит хорошо, если посмотреть на ваши проблемы с кодом, кажется,

let model = DelegateViewController()

Вы создаете новый экземпляр DelegateViewController, но вы должны нажать кнопку на каком-то другом экземпляре DelegateViewController контроллера.

Возможно, вам нужно получить правильный экземпляр model вместо создания нового ИЛИ следует нажать кнопку во вновь созданном экземпляре View Controller.

Пример: вероятно, нужно сделать что-то вроде

class ViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        super.prepare(for: segue, sender: sender)

        if let navigationController = segue.destination as? DelegateViewController {
                selectionButtonDelegate = self = self
        }
     }
}
0 голосов
/ 01 мая 2018

Вы не присвоили selectionButtonDelegate текущему активному DelegateViewController. Измените свой код для доступа к текущему экземпляру вашего DelegateViewController.

import UIKit

protocol SelectionDelegate {
    func selectedButton(name: String)
}

class DelegateViewController: UIViewController {

    static weak var shared: DelegateViewController!

    weak var selectionButtonDelegate: SelectionDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        DelegateViewController.shared = self
    }

    @IBAction func bayernButton(_ sender: UIButton) {
        selectionButtonDelegate.selectedButton(name: "Bayern")
    }

    @IBAction func dortmundButton(_ sender: UIButton) {
        selectionButtonDelegate.selectedButton(name: "Dortmund")

    }
}




import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var selectedButton: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        DelegateViewController.shared.selectionButtonDelegate = self
    }
}

extension ViewController: SelectionDelegate {
    func selectedButton(name: String) {
        selectedButton.text = name
    }
}

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

...