2014-10-28 53 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