将从NIB加载的视图添加到自定义表格视图单元格并不按预期工作

时间:2016-12-16 02:11:20

标签: ios swift uitableview subview tableviewcell

我一直在玩桌面视图单元格中重用视图。我有一个自定义表格视图单元格和另一个可重复使用的视图,我在单元格和我的应用程序的其他部分使用。可重用视图在XIB文件中定义,并与其类定义相关联。

当我尝试在自定义表格视图单元格中获取视图时,我遇到了奇怪的行为

DevicesTableViewCell< - 自定义UITableViewCell,用于保存另一个NIB中的视图。

DeviceView< - 自定义可重用视图,可在单元格和应用程序的其他部分中使用,如堆栈视图。

现在,当我尝试加载笔尖并将其添加到单元格内容视图时,视图不会显示。但是,如果我尝试将其添加到表视图单元格内的容器视图中,它确实有效。

单元格设置代码:

    let devicesName         = sectionDataArray[MasterSection.devices.rawValue].reuseId
    let devicesNib          = UINib(nibName: devicesName, bundle: nil)
    tableView.register(devicesNib, forCellReuseIdentifier: devicesName)
  1. 未出现视图的代码:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: sectionDataArray[indexPath.section].reuseId)
    
    print ("-- Showing devices cell")
    let deviceCell = cell as! DevicesTableViewCell
    
    // Optimise this, we way not necessarily need to load this view every single time
    if deviceCell.deviceView == nil {
        deviceCell.deviceView = Bundle.main.loadNibNamed("DeviceView", owner: self, options: nil)?.first as! DeviceView
        deviceCell.containerView.isHidden = true
        deviceCell.contentView.addSubview(deviceCell.deviceView)
    
        let views = ["deviceView" : deviceCell.deviceView]
    
        deviceCell.deviceView.translatesAutoresizingMaskIntoConstraints = false
    
        deviceCell.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[deviceView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))
        deviceCell.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[deviceView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))
    }
    
    // TODO - Setup cell data contents
    
    return deviceCell
    }
    
  2. 视图出现的代码:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: sectionDataArray[indexPath.section].reuseId)
    
    print ("-- Showing devices cell")
    let deviceCell = cell as! DevicesTableViewCell
    
    // Optimise this, we way not necessarily need to load this view every single time
    if deviceCell.deviceView == nil {
        deviceCell.deviceView = Bundle.main.loadNibNamed("DeviceView", owner: self, options: nil)?.first as! DeviceView
        //deviceCell.containerView.isHidden = true
        deviceCell.containerView.addSubview(deviceCell.deviceView)
    
        let views = ["deviceView" : deviceCell.deviceView]
    
        deviceCell.deviceView.translatesAutoresizingMaskIntoConstraints = false
    
        deviceCell.containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[deviceView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))
        deviceCell.containerView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[deviceView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views))
    }
    
    // TODO - Setup cell data contents
    
    return deviceCell
    }
    
  3. 自定义单元代码:

    class DevicesTableViewCell: UITableViewCell {
    
    @IBOutlet weak var containerView: UIView!
    var deviceView: DeviceView!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    }
    

    结果:

    1. 添加到contentView - >什么都没有,只有白色背景。

    2. 添加到containerView - >视图显示为正常,并且包含在内部具有正确自动布局约束的单元格中。

    3. 注意: containerView位于Custom Table Cell View XIB文件中。容器视图具有自动布局约束,将其视图绑定到边距为0的表视图单元视图。

      问题: 任何人都可以解释为什么在这种特殊情况下,内容视图无法正确显示其子视图吗?

1 个答案:

答案 0 :(得分:1)

问题是我在XIB文件中有错误的对象。

在DevicesTableViewCell.xib中,创建的视图是一个UIView对象。不是UITableViewCell对象。

如果从XIB实例化单元格,请确保从UITableViewCell创建视图对象。

这是因为UITableViewCell对象包含一个内容视图。

更改XIB文件后,将对象添加到内容视图工作正确。