我正在编写一个可以展开/折叠的自定义表头视图,我为它编写了如下协议:
protocol ExpandableHeadViewDelegate{
var expandStateReference : [String : Bool] { get set }
var tblVw : UITableView { get set }
func didTapActionFromHeadVw(_ view: ExpandableHeadView, tag: Int)
}
这是我的可扩展头视图类,我试图实现的是当点击此视图时,我将能够从嵌入可扩展视图的UITableView调用所需的方法:
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也会给我一个错误:
协议需要类型为“UITableView”的属性“tableVw”;是否
要添加存根吗?
但是设置
var expandedCells ..
设置正确。如果我将tableVw设置为非IBOutlet,它可以编译,但我希望tableVw是IBOutlet属性。编辑:
为tableVw添加一个存根变量并将我的tableView IBOutlet分配给它可以工作。但我仍然很好奇,如果不使用stub变量,是否可以实现这一点
internal var tableVw: UITableView?
@IBOutlet var tableView: UITableView!
.
.
func viewDidload {
self.tableVw = self.tableView
}
最佳答案
很简单-将协议中的属性声明为UITableView!
。!
很重要-很多。!
使变量成为可选变量,但显式展开变量。这基本上意味着,展开是为你做的,在引擎盖下。您向编译器保证,尽管此变量可以包含一个nil
,但在您尝试访问它之前,您将确保它将被设置为一个正确的值。如果IBOutlets
这是由SDK为您完成的。