如何为UITableViewCell的contentView创建UIView

时间:2014-10-12 05:16:42

标签: ios uitableview swift

我创建了一个UITableView,其中包含许多静态UITableViewCell。我已将其中一个静态单元格的样式更改为Custom。我已为此单元格创建了一个插座,以便我可以通过编程方式将子视图添加到其contentView。在viewWillAppear中,我创建了一个UILabel并对其进行了适当的配置。然后我针对某些条件进行测试,如果确实如此,我创建了UIView并将UILabel添加为子视图,然后我将UIView添加到单元格的contentView 。如果不是这样,我只需将UILabel本身添加到contentView

第一次出现单元格时效果很好,但是如果我执行push segue然后向后导航,则contentView不会重置,因此它看起来与第一次出现时相同。它应该已更改,因为检查的条件已更改。我知道这是因为它只是添加了另一个子视图。因此,我在创建tagUIView时巧妙地添加了UILabel,然后在运行代码创建相应视图之前,我使用tag删除了视图从超级视图。我还存储了对UILabel(不是UIView)的引用,因此我也将其设置为nil

最终结果是单元格在第一次渲染时显得很好,但是从push segue返回后,子视图按预期被移除,但是没有添加另一个子视图,因此单元格完全为空。我逐步完成了代码并且全部被调用了所以我不确定为什么在第一次删除它之后没有出现任何内容。

编辑:这必须是autoresizingMask的问题 - 手动设置框架的工作原理。我怎样才能确保帧始终填充父框架?

//Store reference to UILabel and bool to test again
var label: UILabel?
var someCondition = false

//viewWillAppear:
cell.contentView.viewWithTag(100)?.removeFromSuperview()
label = nil

//This is the issue - frame is always size 1,1
//label = UILabel(frame: CGRectMake(5, 5, 70, 20))
label = UILabel(frame: CGRectMake(0, 0, 1, 1))
label!.autoresizingMask = .FlexibleWidth | .FlexibleHeight

label!.text = "testing"
label!.backgroundColor = UIColor.whiteColor()

someCondition = !someCondition
if someCondition == true {
    var view = UIView()
    view.backgroundColor = UIColor.redColor()
    //need to replace static frame with autoresizingMask here too
    view.frame = CGRectMake(10, 10, 200, 70)
    view.tag = 100
    view.addSubview(label!)
    cell.contentView.addSubview(view)
} else{
    label!.tag = 100
    cell.contentView.addSubview(label!)
}

1 个答案:

答案 0 :(得分:0)

我无法使用与您类似的代码重现您的问题。我用下面的代码测试了它。我在详细控制器中有一个调用cameBackFromDetail的unwind segue,正如你所看到的,它只是否定了Bool的值。当我来回走动时,我看到细胞在带有标签的视图细胞或标签之间交替。另一方面,如果我使用后退按钮返回,我会看到与我离开时相同的单元格,就像我应该的那样。

class TableViewController: UITableViewController {

    @IBOutlet weak var cell: UITableViewCell!
    var label: UILabel?
    var someCondition: Bool = false

    override func viewWillAppear(animated: Bool) {
        if let aView = cell.viewWithTag(100) {
            aView.removeFromSuperview()
            label = nil
        }
        label = UILabel(frame: CGRectMake(5, 5, 70, 20))
        label!.text = "testing"
        label!.backgroundColor = UIColor.whiteColor()
        if someCondition == true {
            var view = UIView()
            view.backgroundColor = UIColor.redColor()
            view.frame = CGRectMake(10, 10, 200, 70)
            view.tag = 100
            view.addSubview(label!)
            cell.contentView.addSubview(view)
        }else{
            label!.tag = 100
            cell.contentView.addSubview(label!)
        }
    }


    @IBAction func cameBackFromDetail(segue: UIStoryboardSegue) {
        someCondition = !someCondition
    }

}