了解iOS编程中的代理

时间:2014-10-28 01:28:55

标签: ios swift delegates

我是iOS编程的新手,我试图理解并开始实现代理,以获取视图控制器之间的信息以及它们可能具有的任何其他用途。

我已经使用this topic进一步了解,但我不能发表评论,因为我刚刚创建了此帐户,所以我无法在帖子上提问。我复制了drewag的例子但这一行 @IBOutlet weak var delegate: ViewControllerBDelegate?  给我一个错误" IBOutlet属性不能有非对象类型SecondViewControllerDelegate"

我删除了它并运行但两个视图控制器之间没有发送信息。我以为我开始理解代表,但只是实施它们开始变得令人沮丧。我已经在这几天了。

FirstViewController:

class FirstViewController: UIViewController, SecondViewControllerDelegate {
@IBOutlet weak var theMap: MKMapView!

func requiredText() -> String {
    return "test"
}

SecondViewcontroller:

    protocol SecondViewControllerDelegate {
    func requiredText() -> String
}

class SecondViewController: UIViewController {
    @IBOutlet weak var label: UILabel!

    @IBOutlet weak var delegate: SecondViewControllerDelegate?

    @IBAction func decide(sender: AnyObject) {
        if let actualDelegate = self.delegate {
            self.label.text = actualDelegate.requiredText()
    }
}

所以我的问题就是我做错了什么?我以为我正确地遵循了这个例子。

2 个答案:

答案 0 :(得分:1)

你需要像这样声明SecondViewControllerDelegate

@objc protocol SecondViewControllerDelegate {
    func requiredText() -> String
}

这只是Swift编译器或运行时的一个怪癖。 @objc指令使编译器发出有关协议的其他信息。在运行时,程序使用该信息来验证委托实现协议的方法。由于这些对象是从xib(或storyboard)加载的,因此编译器无法在编译时对其进行验证。

答案 1 :(得分:1)

你没有设置你的actualDelegate = firstViewController,所以actualDelegate总是为零。 如果您使用storyboard,请将firstViewController的Identifier设置为" first" 那么

  override func viewDidLoad() {
        super.viewDidLoad()
        let storyboard = UIStoryboard(name: "Main", bundle: nil);
        var firstview = storyboard.instantiateViewControllerWithIdentifier("first") as FirstViewController?;
        self.delegate = firstview;
        // Do any additional setup after loading the view, typically from a nib.
    }