滚动时Tableview消失

Tableview disappears when scrolling

我有一个 tableView,它在用户滚动时显示隐藏的单元格。不确定为什么会发生这种行为。

在viewDidLoad()中

    watchListTable = UITableView(frame: CGRect(x: self.view.frame.width * 0.25, y: 0, width: self.view.frame.width * 0.75, height: 300)) //height = 200
    watchListTable.isHidden = true
    watchListTableFrame = CGRect(x: self.view.frame.width * 0.25, y: 0, width: self.view.frame.width * 0.75, height: 300)
    watchListTableFrameHide = CGRect(x: self.view.frame.width * 0.25, y: 0, width: self.view.frame.width * 0.75, height: 0)
    watchListTable.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
    watchListTable.register(UITableViewCell.self, forCellReuseIdentifier: "closeCell")

    watchListTable.dataSource = self
    watchListTable.delegate = self
    watchListTable.CheckInterfaceStyle()
    watchListTable.roundCorners(corners: .allCorners, radius: 8)
    watchListTable.backgroundColor = .systemGray6
    //remove the bottom line if there is only one option
    watchListTable.tableFooterView = UIView()

    view.addSubview(watchListTable)

一旦用户点击按钮,table 就会以 animatable 方式展开。

   //watchlist won't animate properly on the initial setup. So we set it to be 
    hidden, then change the frame to be 0,  unhide it, and then animate it. Only will 
    be hidden on the initial setup.
    if(watchListTable.isHidden == true)
    {
        watchListTable.isHidden = false
        watchListTable.frame = watchListTableFrameHide
    }
    
    UIView().animateDropDown(dropDown: watchListTable, frames: 
    self.watchListTableFrame)
    watchListTable.reloadData()

在 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

       if(indexPath.row >= watchListStocks.count)
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "closeCell", 
            for: indexPath as IndexPath)
            cell.selectionStyle = .none
            cell.textLabel?.text = indexPath.row == watchListStocks.count + 1 ? 
            "Close List" : "Create New Watchlist"
            cell.textLabel?.textColor = .stockOrbitTeal
            cell.textLabel?.textAlignment = .center
            cell.backgroundColor = .systemGray6
            cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 
            .greatestFiniteMagnitude)
           
            return cell                
        }
        else
        {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: 
            indexPath as IndexPath)
            cell.selectionStyle = .none

            if(indexPath.row == 0)
            {
                cell.layer.cornerRadius = 8
                cell.layer.maskedCorners = [.layerMinXMinYCorner, 
                .layerMaxXMinYCorner]
            }
            else
            {
                cell.layer.cornerRadius = 8
                cell.layer.maskedCorners = [.layerMinXMaxYCorner, 
                .layerMaxXMaxYCorner]
                cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 
                .greatestFiniteMagnitude)
                cell.directionalLayoutMargins = .zero
            }
            
            let label = UITextView()
            
            label.frame = CGRect(x: 0, y: 0, width: cell.frame.width * 0.45, height: 
            cell.frame.height)
            label.text = watchListStocks[indexPath.row].listName
            label.textColor = .stockOrbitTeal
            label.textAlignment = .center
            label.font = UIFont.systemFont(ofSize: 18, weight: UIFont.Weight.medium)
            label.backgroundColor = .systemGray5
            label.delegate = self
            label.tag = indexPath.row
            cell.addSubview(label)
            
            cell.backgroundColor = .systemGray5
            cell.layer.cornerRadius = 8
            
            return cell
        }

当我滚动时,所有单元格都被隐藏了。我看到它们是在 cellForRowAt 中创建的,但是,它们没有出现在我的屏幕上。为什么要隐藏细胞?我搜索了整个 Whosebug。

  1. 您不应该在 cellForRowAt 中添加子视图。当你调用 dequeueReusableCell 时,首先它会创建新的单元格,但是当你开始滚动时它会开始返回之前被关闭的单元格,这意味着它们已经有 UITextView 子视图,并且你正在添加还有一个。

  2. dequeueReusableCell 返回的单元格不必已经有最终大小,这就是为什么你不能使用 cell.frame.width 来计算你的子视图大小,我认为这可能是你看不到它的原因。

你需要做的:创建一个 UITableView subclass,像这样:

class MyCell: UITableViewCell {
    let label = UITextView()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupCell()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupCell()
    }
    
    func setupCell() {
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 18, weight: UIFont.Weight.medium)
        label.backgroundColor = .systemGray5
        contentView.addSubview(label)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        label.frame = CGRect(x: 0, y: 0, width: contentView.frame.width * 0.45, height: contentView.frame.height)
    }
}

此处您在初始化期间仅添加一次子视图,并在每次更改单元格大小时更新标签框架。不要忘记将此 class 添加到情节提要中的单元格和 let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! MyCell,这样您就可以将委托设置为文本字段等。

如果这没有帮助,请查看 View Hierarchy 以了解实际情况

所以经过几个小时,我想通了...

我在 viewDidLoad() 中调用了这个函数

watchListTable.roundCorners(corners: .allCorners, radius: 8)

这让我的 table 在我滚动后隐藏了。我删除了这行代码,table 现在在滚动时完全可见。