Как использовать протокол и делегировать в моем классе? - PullRequest
0 голосов
/ 15 мая 2018

Я использую два контроллера представления, то есть StateListVC и PlayVC.В StateListVC я использую вид контейнера с 3 VC.После нажатия на третий View Controller, я собираюсь в PlayVC с методом делегата.Я не знаю, как это сделать.Пожалуйста, помогите мне решить эту проблему.

StateListVC

class StateListVC: UIViewController {

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

    override func viewWillAppear(_ animated: Bool) {
        if isMoveToAnotherVC
        {
            let vc = self.storyboard?.instantiateViewController(withIdentifier: "PlaceVC") as! PlaceVC
            vc.delegate = self
        }

    }
}

extension StateListVC: MoveToAnotherVC {
    func moving(string: String) {
        print(string)
    }
}

ThirdVC

protocol MoveToAnotherVC {
    func moving(string: String)
}

class PlaceVC: UIViewController {

    @IBOutlet weak var tableViewPlace: UITableView!
    var delegate: MoveToAnotherVC? = nil

    var arrPlace = ["Place1", "Place2"]

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

extension PlaceVC: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPlace.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = arrPlace[indexPath.row]
        return cell
    }
}

extension PlaceVC: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    {
        isMoveToAnotherVC = true

        print(delegate)
        guard let delegate = self.delegate else{
            print("Delegate not set")
            return
        }

        delegate.moving(string: "test")
    }
}

1 Ответ

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

Это нормально подключено:

protocol MoveToAnotherVC: AnyObject {
    func moving(string: String)
}

class StateListVC: UIViewController, MoveToAnotherVC {

    override func viewDidLoad() {
        super.viewDidLoad()
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "PlaceVC") as! PlaceVC
        vc.delegate = self
    }

    func moving(string: String) {
        print(string)
    }

}

class PlaceVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableViewPlace: UITableView!
    weak var delegate: MoveToAnotherVC?
    var arrPlace = ["Place1", "Place2"]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPlace.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = arrPlace[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        delegate?.moving(string: "test")
    }

}

Я сделал протокол протоколом класса, переместил создание экземпляра контроллера представления в viewDidLoad, удалил некоторую (что я считаю) постороннюю распаковку и удалил ваш протокол/ делегировать шаблон до основ.Это работает.Я включил бы это в ваш проект и добавил бы то, что вам нужно, по частям, пока он не сломается, потому что ваша проблема выходит за рамки этого.Я подозреваю, что это может быть связано с тем, что вы не включили в свой вопрос, но это отвечает на ваш вопрос о том, как настроить шаблон протокола / делегата.

...