Swift can't call protocol method via delegate

后端 未结 2 733
清歌不尽
清歌不尽 2021-01-16 08:43

I have two classes. One class is named ViewController and the other class is named TabView.

My goal is to call a function changeTab()

相关标签:
2条回答
  • 2021-01-16 09:20

    you are creating a new instance in this line:

    let myVC = ViewController()
    

    you should get existing instance of your ViewController.then set

    myVC.delegateCustom = self
    
    0 讨论(0)
  • 2021-01-16 09:21

    You are using the delegate pattern wrongly. It is hard to tell which controller you want to define the protocol for and which one you want to adopt it - but here is one possible way.

    // 1. Define your protocol in the same class file as delegate property.
    protocol TabViewProtocol: class {
        func changeTab() 
    }
    
    // 2. Define your delegate property
    class ViewController: NSViewController {
        // delegate
        weak var delegateCustom : TabViewProtocol?
    
        override func viewDidLoad() {
            // It should be nil as you have not set the delegate yet.
            print(delegateCustom) // outputs "nil"
        }
    
        func buttonClickFunction() {
            print(delegateCustom) // outputs "nil"
            delegateCustom?.changeTab() // doesn't work
        }
    }
    
    // 3. In the class that will use the protocol add it to the class definition statement
    
    class TabView: NSTabViewController, TabViewProtocol {
    
        let myVC = ViewController()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            myVC.delegateCustom = self
    
            // Should output a value now
            print(myVC.delegateCustom) // outputs "self"
        }
    
        func changeTab() {
            print("test succeed")
        }
    }
    
    0 讨论(0)
提交回复
热议问题