协议实现中的IBOutlet

Aas*_*gar 4 uitableview uikit ios swift swift-protocols

我有以下协议:

protocol TextViewInputField {
   var indexPath: IndexPath? { get set }
   var textView: UITextView { get set }
   var lblPlaceHolder: UILabel { get set }
   func updatePHHiddenState()
} 
Run Code Online (Sandbox Code Playgroud)

一个单元TMStyle2Cell实现此协议如下:

class TMStyle2Cell: UITableViewCell,TextViewInputField {

    @IBOutlet var lblPlaceHolder: UILabel!
    @IBOutlet var textView: UITextView!
    @IBOutlet var viewSeperator: UIView!
    var indexPath: IndexPath?

    func updatePHHiddenState() {

    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我收到以下错误?

TMStyle2Cell不确认协议TextVeiwInputField.

pli*_*sey 9

协议中的类型和实现不匹配.你需要:

protocol TextViewInputField {
   var indexPath: IndexPath? { get set }
   var textView: UITextView! { get set }
   var lblPlaceHolder: UILabel! { get set }
   func updatePHHiddenState()
} 
Run Code Online (Sandbox Code Playgroud)

如果您使用弱IBOutlets,您还需要包括:

protocol TextViewInputField {
   var indexPath: IndexPath? { get set }
   weak var textView: UITextView! { get set }
   weak var lblPlaceHolder: UILabel! { get set }
   func updatePHHiddenState()
} 
Run Code Online (Sandbox Code Playgroud)

最后,小点,但set协议的一部分可能没有必要.

  • 你不应该在Swift 4.1中包含`weak`.如果你这样做,编译器会警告你删除它(''''不应该应用于协议中的属性声明,并且在将来的版本中将不允许). (6认同)

Art*_*rov 5

协议示例。在Swift 4.2中测试。

@objc protocol ImageRepresentable {
    var imageView: UIImageView! { get set }
}
Run Code Online (Sandbox Code Playgroud)

和查看。

class ViewA: UIView, ImageRepresentable {
    @IBOutlet weak var imageView: UIImageView!
}
Run Code Online (Sandbox Code Playgroud)

对于你的情况。

@objc protocol TextViewInputField {
    var indexPath: IndexPath? { get set }
    var textView: UITextView! { get set }
    var lblPlaceHolder: UILabel! { get set }
    func updatePHHiddenState()
}
Run Code Online (Sandbox Code Playgroud)