简体   繁体   中英

UITableViewCells invisible

Requirement :

I have a list of UITableviewCell loaded from a nib that I'm presenting on UITableview . The first time I open the UIViewController all cells are shown correctly and work as expected.

Issue :

If I navigate back to the parent and then open the UIViewController again the UITableviewCell are 'invisible'. I say invisible because with a breakpoint in cellForRowAt I can see that the table view does load all cells and the cells are valid.

Code :

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 13
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 40
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = (project?.sliderData.sliders[indexPath.row].view)! as UITableViewCell
    print(cell.contentView.subviews.count)
    if let left = cell.viewWithTag(2) as? UILabel {
        left.text = "left"
    }
    if let middle = cell.viewWithTag(3) as? UILabel {
        middle.text = "middle"
    }
    if let right = cell.viewWithTag(4) as? UILabel {
        right.text = "right"
    }
    return cell
}

Screen Shot Image

在此处输入图片说明

Expected observation :

I was thinking that maybe the subviews of the cells get released because I don't have any bindings to them in IB . To test this I'm printing the count of subviews and writing some text to the subview labels . And everything seems to go fine, the cells are loaded and the labels are there but the cells just don't show up.

But then, if I scroll the TableView up and down a little to get some cells updated those cells do appear at the top and bottom of the view as shown in the pic.

You need to call dequeueReusableCell(withIdentifier: "cell") inside your code then will show your table cell. It will reuse cell for your all numbers of row data content.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! UITableViewCell
   return cell
}

More Details : How to create uitableview with multiple sections in iOS Swift.

Did not find reason why the tableView behaves the way it does so I solved the issue by dequeueing default cells. The views provided by the slider objects are added as subviews to the dequeued cells. Now the subviews can of course be any UIViews.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "sliderCell")
    if cell == nil {
        cell = UITableViewCell.init(style: .default, reuseIdentifier: "sliderCell")
    }
    cell?.addSubview((project?.sliderData.sliders[indexPath.row].view)!)
    return cell!
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM