如何从一致的类中正确设置协议中的属性?

时间:2017-04-01 18:35:14

标签: ios swift uitableview delegates protocols

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

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
}

1 个答案:

答案 0 :(得分:1)

非常简单 - 将协议中的属性声明为UITableView!!很重要 - 很多。

!使变量成为可选变量,但是显式解包变量。这基本上意味着,在引擎盖下为你完成展开。您保证编译器,虽然此变量可以包含nil,但在尝试访问它之前,您将确保它将设置为正确的值。如果IBOutlets,则由SDK完成。