我是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()
}
}
所以我的问题就是我做错了什么?我以为我正确地遵循了这个例子。
答案 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.
}