Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从一致性类正确设置协议中的属性?_Ios_Swift_Uitableview_Delegates_Protocols - Fatal编程技术网

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

Ios 如何从一致性类正确设置协议中的属性?,ios,swift,uitableview,delegates,protocols,Ios,Swift,Uitableview,Delegates,Protocols,我正在编写一个可以展开/折叠的自定义表头视图,我为它编写了一个协议,如下所示: protocol ExpandableHeadViewDelegate{ var expandStateReference : [String : Bool] { get set } var tblVw : UITableView { get set } func didTapActionFromHeadVw(_ view: ExpandableHe

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

protocol ExpandableHeadViewDelegate{
    var expandStateReference   :  [String : Bool] { get set }
    var tblVw                  :   UITableView { get set }
    func didTapActionFromHeadVw(_ view: ExpandableHeadView, tag: Int)
}
这是我的expandable head view类,我试图实现的是,当点击此视图时,我将能够从嵌入expandable view的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分配给它。但我仍然很好奇,这是否可以在不使用存根变量的情况下实现

internal var tableVw: UITableView?
@IBOutlet  var tableView: UITableView!
.
.
func viewDidload {
   self.tableVw = self.tableView
}

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

使变量成为可选变量,但显式取消包装。这基本上意味着,展开是为你做的,在引擎盖下。您向编译器承诺,尽管此变量可以包含一个
nil
,但在尝试访问它之前,您将确保它将被设置为一个正确的值。在
IBOutlets
的情况下,这是由SDK为您完成的