簡體   English   中英

如何在課堂上使用協議和委托?

[英]How to use protocol and delegate in my class?

我正在使用兩個視圖控制器,即StateListVC和PlayVC。 在StateListVC中,我將容器視圖與3個VC一起使用。 點擊3rd 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")
    }
}

這很不錯:

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 ,刪除了一些(我認為)無關的解包,並將協議/委托模式簡化為基礎。 這可行。 我會將其插入您的項目中,並逐個添加您需要的內容,直到它破裂,因為您的問題不在此范圍之內。 我懷疑這可能與您未在問題中包含的內容有關,但這可以回答您有關如何設置協議/委托模式的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM