我正在编写一个可以展开/折叠的自定义表头视图,我为它编写了如下协议:

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为您完成的。

10-08 12:30