2014-10-03 77 views
26

無法在Interface Builder中將聲明爲@IBOutlet的CustomView的代理屬性連接到ViewController - 無法建立連接。在Swift中Interface Builder,@IBOutlet和委託和數據源協議

下面的代碼

class CustomView: UIView { 
    @IBOutlet var delegate: CustomViewDelegate? 
} 

@objc protocol CustomViewDelegate { 
    ... 
} 


class ViewController: UIViewController, CustomViewDelegate { 
    ... 
} 

@objc被使用,因爲swift protocol, IBOutlet property cannot have non-object type,不知道爲什麼protocol CustomViewDelegate: class {}不起作用。

其他人碰到類似的東西?

+0

貴'UIViewController'在Interface Builder具有同級車專門設置爲'ViewController'?此外,它通常是一個要求(最後我檢查),「@ IBOutlet」屬性被定義爲隱式解包類型,如下所示:「CustomViewDelegate!」。這允許它們在實例化時爲'nil',同時允許您在連接完成後無需綁定就可以使用它們。 – 2014-10-03 13:58:16

回答

56

從Xcode的版本註釋:

界面生成器不支持連接到出口以迅速文件當出口的類型是一個協議。

解決方法:將出口的類型聲明爲AnyObject或NSObject,使用Interface Builder將對象連接到出口,然後將出口的類型更改回協議。

編輯:的Xcode 9 Beta 3的發佈說明稱,這一解決辦法應該不再是必要的。

+3

Wowzer!這工作,謝謝。蘋果...請把它放在一起! – josephap 2015-03-09 01:22:26

+0

沒有。更改回協議類型後,「類不符合鍵值」。 – stone 2015-03-15 12:48:01

+0

這隻對我有效。在一種情況下,我在UIView上定義了我自己的委託,將其連接到UIViewController,它工作。在另一個地方,我在UIViewController上定義我的委託以連接到另一個UIViewController,但它沒有。我嘗試了很多配置。任何想法@matt可能會在這裏發生什麼? – josephap 2015-03-15 21:50:02

8

另一種是不漂亮,但:

@IBOutlet weak var ibDelegate: NSObject? 
@IBOutlet weak var ibDataSource: NSObject? 
var delegate: MultipleButtonViewDelegate? { return ibDelegate as? MultipleButtonViewDelegate } 
var dataSource: MultipleButtonViewDataSource? { return ibDataSource as? MultipleButtonViewDataSource } 
+0

很好的答案!使用這種方法來防止更改類型通常是出口。 – t4nhpt 2016-01-06 06:46:43

13

Adam Waite provides a nice workaround.但是我更喜歡下面的解決方案,它強調的是解決辦法,一旦Xcode中得到固定,也容易去除多餘的財產。

class CustomView: UIView { 
    @IBOutlet 
    public var delegate: CustomViewDelegate? 

    /// Workaround for Xcode bug that prevents you from connecting the delegate in the storyboard. 
    /// Remove this extra property once Xcode gets fixed. 
    @IBOutlet 
    public var ibDelegate: AnyObject? { 
     get { return delegate } 
     set { delegate = newValue as? CustomViewDelegate } 
    } 

    func someMethod() { 
     // Here we always refer to `delegate`, not `ibDelegate` 
     delegate?.onSomethingHappened() 
    } 
} 

@objc protocol CustomViewDelegate { 
    ... 
} 

嘿,這個bug已經多年的一個半老?

1

對我來說,原因是表格視圖是nil在我試圖設置它的數據源和委託。這是由於指定的初始化程序調用initWithNibName:bundle:,它不保證initialized connections。推遲我的代表和數據源設置爲viewDidload就像一個魅力。

2

這是一個古老的線程,但我想我會指出,作爲Xcode的9測試版3中,現在可以將用swift編寫的自定義委託連接到界面構建器。

根據發行說明

界面生成器現在可以識別網點,動作,以及其擁有斯威夫特協議擴展類中聲明視察 性能。 (22201035)

// Can connect this to interface builder now  
class MyViewController: UIViewController { 
    @IBOutlet weak var myDelegate: TheNewDelegate? 
}