Can't connect delegate property of CustomView
declared as @IBOutlet toViewController
in Interface Builder – simply can't establish a connection.
Here's the code
class CustomView: UIView { @IBOutlet var delegate: CustomViewDelegate? } @objc protocol CustomViewDelegate { ... } class ViewController: UIViewController, CustomViewDelegate { ... }
@objc
is used because of swift protocol, IBOutlet property cannot have non-object type, don't know why protocol CustomViewDelegate: class {}
doesn't work.
Anyone else came across something like that?
From the Xcode release notes:
Interface Builder does not support connecting to an outlet in a Swift file when the outlet’s type is a protocol.
Workaround: Declare the outlet's type as AnyObject or NSObject, connect objects to the outlet using Interface Builder, then change the outlet's type back to the protocol.
EDIT: Xcode 9 beta 3 release notes say that this workaround should no longer be necessary.
Adam Waite provides a nice workaround. I however prefer the following solution as it emphasizes the workaround and the extra property can also easily be removed once Xcode gets fixed.
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 { ... }
Hey, is this bug already one and a half years old?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With