将具有屏幕视图的另一个类的委托设置为 self

Che*_*ong 1 delegates protocols swift

我对 iOS 编程还很陌生。我有这个设置:

ViewController 在IB上查看,有课 ViewController

SecondController 在IB上查看,有课 secondController

我有协议:

protocol SecondControllerDelegate {
    func getSomething() -> String
}
Run Code Online (Sandbox Code Playgroud)

我在 SecondController 上有委托变量:

class secondController: UIViewController {
    var delegate: SecondControllerDelegate?
    @IBOutlet weak var labelStatus: UILabel!

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

    @IBAction func buttonTouch(sender: AnyObject) {
        labelStatus.text = delegate?.getSomething()
    }

    func try () {
        labelStatus.text = "testing"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,根据无处不在的提示,为了可以调用delegate?.getSomething()at SecondController.buttonTouch(),我需要在 viewController 上进行如下设置:

class ViewController: UIViewController, SecondControllerDelegate {
    override func viewDidLoad () {
        super.viewDidLoad()
        SecondController.delegate = self
    }
    func doSomething () -> String {
        return "testing"
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会产生错误'SecondController.type' does not have a member named 'delegate'

其他一些网站说:

class ViewController: UIViewController, SecondControllerDelegate {
    var secondController = SecondController()
    override func viewDidLoad () {
        super.viewDidLoad()
        secondController.delegate = self
    }
    func doSomething () -> String {
        return "testing"
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,就没有错误了。但是如果我在第二个屏幕上做一些应该调用委托的事情,它不会调用委托,就像 SecondController 是两个不同的对象(一个是由 StoryBoard 创建的,一个是在 ViewController 中手动创建的),即labelStatus应该已更改为“测试”,根本没有改变。但是如果调用函数它会改变try()。我该怎么做?

编辑:我忘了提到我使用了 NavigationController 和 segue 从第一个屏幕过渡到第二个屏幕。

Den*_*ann 5

因为您尝试学习如何在 Swift 中构建委托,所以我在下面为您编写了一个简单的委托示例

protocol SecondViewControllerDelegate {
    func didReceiveInformationFromSecondViewcontroller (information: String)
}

class ViewController: UIViewController, SecondViewControllerDelegate {

    func openSecondViewController () {
        if let secondViewControllerInstance: SecondViewController = storyboard?.instantiateViewControllerWithIdentifier("SecondViewController") as? SecondViewController {
            secondViewControllerInstance.delegate = self
            navigationController?.pushViewController(secondViewControllerInstance, animated: true)
        }
    }

    func didReceiveInformationFromSecondViewcontroller(information: String) {
        ////Here you get the information, after sendInfoToViewController() has been executed
    }

}


class SecondViewController: UIViewController {

    var delegate: SecondViewControllerDelegate?

    func sendInfoToViewController () {
        delegate?.didReceiveInformationFromSecondViewcontroller("This ist the information")
    }

}
Run Code Online (Sandbox Code Playgroud)

更新

在使用 Storyboard Segues 时遵循同样的事情

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let secondViewControllerInstance: SecondViewController = segue.destinationViewController as? SecondViewController {
            secondViewControllerInstance.delegate = self
        }
    }
Run Code Online (Sandbox Code Playgroud)