我正在编写一个可以扩展/折叠的自定义表头视图,我为它编写了一个协议,如下所示:
protocol ExpandableHeadViewDelegate{
var expandStateReference : [String : Bool] { get set }
var tblVw : UITableView { get set }
func didTapActionFromHeadVw(_ view: ExpandableHeadView, tag: Int)
}
这是我的可扩展头视图类,我试图实现的是当点击这个视图时,我将能够从UITableView中调用我需要的方法,其中嵌入了expandableView:
class ExpandableHeadView: UIView {
var delegate : ExpandableHeadViewDelegate?
//set up tap recognizer
.
.
.
.
private func viewTapped {
if let delegate = delegate {
delegate.tblVw.reloadData()
}
}
}
我使用此类的viewcontroller如下:
class PlayersViewController: UIViewController,UITableViewDelegate,
UITableViewDataSource, ExpandableHeadViewDelegate {
var expandedCells = [String : Bool]() //
@IBOutlet var tableVw: UITableView! // compile time error
}
我面临的问题是即使我在我的委托类中声明我的'var tableVw',Xcode也会给我一个错误:
协议要求属性'tableVw'的类型为'UITableView';你呢 想要添加存根?
设置var expandedCells ..
但设置正确。如果我将tableVw设置为非IBOutlet,它可以编译,但我希望我的tableVw是一个IBOutlet属性。
编辑: 为tableVw添加存根变量并将tableView IBOutlet分配给它。但是我仍然很好奇,如果不使用存根变量就可以实现这一点
internal var tableVw: UITableView?
@IBOutlet var tableView: UITableView!
.
.
func viewDidload {
self.tableVw = self.tableView
}
答案 0 :(得分:1)
非常简单 - 将协议中的属性声明为UITableView!
。 !
很重要 - 很多。
!
使变量成为可选变量,但是显式解包变量。这基本上意味着,在引擎盖下为你完成展开。您保证编译器,虽然此变量可以包含nil
,但在尝试访问它之前,您将确保它将设置为正确的值。如果IBOutlets
,则由SDK完成。