ios - 如何从一致的类中正确设置协议(protocol)中的属性?

标签 ios swift uitableview delegates protocols

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

protocol ExpandableHeadViewDelegate{
    var expandStateReference   :  [String : Bool] { get set }
    var tblVw                  :   UITableView { get set }
    func didTapActionFromHeadVw(_ view: ExpandableHeadView, tag: Int)
}

这是我的可扩展头部 View 类,我试图实现的是当这个 View 被点击时,我将能够从嵌入了 expandableView 的 UITableView 调用我需要的方法:

class ExpandableHeadView: UIView {
    var delegate : ExpandableHeadViewDelegate?
    //set up tap recognizer
    .
    .
    .
    .
    private func viewTapped {
        if let delegate = delegate {
            delegate.tblVw.reloadData()
        }
    }

}

我使用这个类的 View Controller 如下:

class PlayersViewController: UIViewController,UITableViewDelegate,
UITableViewDataSource, ExpandableHeadViewDelegate {
    var expandedCells = [String : Bool]() //
    @IBOutlet var tableVw: UITableView! // compile time error
}

我面临的问题是,即使我在我的委托(delegate)类中声明了我的“var tableVw”,Xcode 也给我一个错误:

Protocol requires property 'tableVw' with type 'UITableView'; do you want to add stub?

设置 var expandedCells .. 但是设置正确。如果我将 tableVw 设置为非 IBOutlet,它可以编译,但我希望我的 tableVw 成为 IBOutlet 属性。

编辑: 为 tableVw 添加 stub 变量并将我的 tableView IBOutlet 分配给它有效。但是我仍然很好奇是否可以在不使用 stub 变量的情况下实现这一点

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

最佳答案

非常简单 - 在您的协议(protocol)中将属性声明为 UITableView!! 很重要。

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

关于ios - 如何从一致的类中正确设置协议(protocol)中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43160578/

相关文章:

ios - Xcode 10 构建错误 : 'must declare at least one output file'

swift - hkanchoredObjectQuery UpdateHandler仅调用一次

ios - UIPageViewController 与 TableView

ios - 如何使用 Swift 3 在泛型函数中获取计算变量的子类版本?

objective-c - IOS:两个具有两种不同委托(delegate)方法的 UIAlert

objective-c - 切换 View Controller

ios - 如何在 ios 应用程序中的谷歌地图上添加多个引脚

ios - 使用设备旋转上的 Core Motion 旋转 View

javascript - iOS 上的 Safari,在弹出虚拟键盘之前是否有任何事件?

iphone - 如何在 viewController 中使用 UITabbar?