我正在编写一个可以展开/折叠的自定义表头 View ,我为它编写了如下协议(protocol):
protocol ExpandableHeadViewDelegate{
var expandStateReference : [String : Bool] { get set }
var tblVw : UITableView { get set }
func didTapActionFromHeadVw(_ view: ExpandableHeadView, tag: Int)
}
这是我的可扩展头部 View 类,我试图实现的是当这个 View 被点击时,我将能够从嵌入了 expandableView 的 UITableView 调用我需要的方法:
class ExpandableHeadView: UIView {
var delegate : ExpandableHeadViewDelegate?
//set up tap recognizer
.
.
.
.
private func viewTapped {
if let delegate = delegate {
delegate.tblVw.reloadData()
}
}
}
我使用这个类的 View Controller 如下:
class PlayersViewController: UIViewController,UITableViewDelegate,
UITableViewDataSource, ExpandableHeadViewDelegate {
var expandedCells = [String : Bool]() //
@IBOutlet var tableVw: UITableView! // compile time error
}
我面临的问题是,即使我在我的委托(delegate)类中声明了我的“var tableVw”,Xcode 也给我一个错误:
Protocol requires property 'tableVw' with type 'UITableView'; do you want to add stub?
设置 var expandedCells ..
但是设置正确。如果我将 tableVw 设置为非 IBOutlet,它可以编译,但我希望我的 tableVw 成为 IBOutlet 属性。
编辑: 为 tableVw 添加 stub 变量并将我的 tableView IBOutlet 分配给它有效。但是我仍然很好奇是否可以在不使用 stub 变量的情况下实现这一点
internal var tableVw: UITableView?
@IBOutlet var tableView: UITableView!
.
.
func viewDidload {
self.tableVw = self.tableView
}
最佳答案
非常简单 - 在您的协议(protocol)中将属性声明为 UITableView!
。 !
很重要。
!
使变量成为可选变量,但显式解包变量。这基本上意味着,展开是在引擎盖下为您完成的。您向编译器保证,尽管此变量可以包含 nil
,但您将确保在尝试访问它之前将其设置为正确的值。对于 IBOutlets
,这是由 SDK 为您完成的。
关于ios - 如何从一致的类中正确设置协议(protocol)中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43160578/