如何在我的课堂上使用协议和委托?

时间:2018-05-15 17:22:43

标签: ios swift uitableview delegates protocols

我正在使用两个视图控制器,即StateListVC和PlayVC。在StateListVC中,我使用3个VC的容器视图。点击第3个视图控制器后,我将使用委托方法进入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 :(得分:0)

这很好用:

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,删除了一些(我认为)无关的展开,并将协议/委托模式剥离到基础。这有效。我会把它插入你的项目并逐个添加你需要的东西,直到它因为问题超出这个范围而中断。我怀疑它可能与您未在问题中包含的内容有关,但这回答了有关如何设置协议/委托模式的问题。