2014-10-28 62 views
0

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

抢劫的建议固定我的错误。但是我的代码仍然没有做我想做的事情。它应该将标签文本更改为发送的字符串,在这种情况下,当我点击附加到我的决定功能的按钮时,这是“测试”。 – 2014-10-28 01:49:50

+0

如果我从循环中提取'self.label.text = actualDelegate.requiredText()'(和声明)Xcode说“SecondViewControllerDelegate没有名为requiredText的成员函数” 编辑:我加了!它拿走了错误,但我BAD_INSTRUCTION – 2014-10-28 01:55:36

回答

1

需要声明SecondViewControllerDelegate这样的:

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

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

+0

嗯,我会upvote,但我不能。但是谢谢你!它让我的错误消失了。现在,当我运行它,并按下触发我的“决定”功能的按钮,它不会更改文本。我的@IBOutlet委托应该与某些东西链接?它只是一个旁边的开放圆圈。我无法拖动视图控制器来连接它。 再次感谢! – 2014-10-28 01:48:06

+0

来自[Apple](https://developer.apple.com/library/ios/documentation/swift/conceptual/Swift_Programming_Language/Protocols.html)“只有在您的协议标有@objc属性的情况下,才能指定可选协议要求“。什么使得这是一个可选协议? – 2014-11-02 03:49:20

1

你不设置你的actualDelegate = firstViewController,所以actualDelegate总是为零。 如果你用故事板,设置firstViewController的标识为“第一” 然后

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. 
    } 
+0

谢谢!现在我只是不明白什么 'instantiateViewControllerWithIdentifier(“first”)as FirstViewController?;'确实。它创建了FirstViewController类的新对象吗?或者它只是分配一个本地名称到已经创建的对象(从故事板)? 编辑:我只是看了什么instantiate的意思。我猜它是后者? – 2014-11-02 02:01:49

+0

'self.label.text = actualDelegate!.requiredText()'提供了一个EXC_BAD_INSTRUCTION – 2014-11-02 02:22:31