swift协议,IBOutlet属性不能有非对象类型

Ren*_*ger 16 interface-builder ios swift

我想在IB中连接一个自定义的快速代表.委托是一个在swift中实现某个协议的对象.

protocol ThumbnailTableViewCellDelegate {
    func cellWasTouched(thumbnail: Bool, cell: UITableViewCell)
}

class ThumbnailTableViewCell: UITableViewCell {
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,编译器抱怨:

error: 'IBOutlet' property cannot have non-object type 'ThumbnailTableViewCellDelegate'
    @IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
    ^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

Nat*_*ook 31

您必须将ThumbnailTableViewCellDelegate协议声明为@objc:

@objc protocol ThumbnailTableViewCellDelegate {
    func cellWasTouched(thumbnail: Bool, cell: UITableViewCell)
}
Run Code Online (Sandbox Code Playgroud)

这是因为@IBOutlet声明变量as weak,它只适用于对象.我不确定为什么你不能只说协议符合AnyObject,也许这是一个Swift错误.

  • 这编译但我现在有问题实际连接故事板中的插座 (9认同)

Mor*_*n J 13

您可以使用此变通方法将IB中自己的协议连接起来.这是Xcode的一个已知问题,所以有一天可能会解决.直到那时:

  1. 将委托声明为AnyObject - @IBOutlet var delegate:AnyObject!
  2. 在Interface Builder中连接委托
  3. 将插座的类型更改为您的协议,例如@IBOutlet var delegate:MyDelegate

这适合我.