当前位置: 首页 > 知识库问答 >
问题:

滚动时表格视图消失

黎曾笑
2023-03-14

我有一个当用户滚动时显示隐藏单元格的tableView。不确定为什么会出现这种情况。

在视图中DidLoad()

    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)

用户点击按钮后,表格将以可设置动画的方式展开。

   //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 索引路径: 索引路径) -

       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
        }

当我滚动时,所有单元格都被隐藏。我看到它们是在单元格中创建的,但是,它们不会出现在我的屏幕上。为什么细胞被隐藏?我已经搜索了整个堆栈溢出。

共有2个答案

郏兴贤
2023-03-14

所以几个小时后,我想通了…

我已经在视图DidLoad()中调用了这个函数

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

滚动后,我的桌子被隐藏起来了。我删除了这行代码,现在滚动时表格完全可见。

端木望
2023-03-14

>

  • 您不应该在cellForRowAt中添加子视图。当您调用dequeueReusableCell时,起初它会创建新单元格,但当您开始滚动时,它会开始返回之前被关闭的单元格,这意味着它们已经有UITextView子视图,并且您会在此基础上再添加一个。

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

    你需要做的:创建一个 UITableView 子类,如下所示:

    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)
        }
    }
    

    在这里,您只在初始化过程中添加一次子视图,并且每次单元格大小发生变化时都会更新标签框架。不要忘记将此类添加到故事板中的单元格中,并且let cell=tableView.dequeueReusableCell(用标识符:“MyCell”,用于:indexPath作为IndexPath)作为!MyCell,这样您就可以将委托设置为文本字段等。

    如果这没有帮助,检查视图层次结构,看看那里到底发生了什么

  •  类似资料:
    • 我的TableView包含一些数字数据。当我说按按钮编辑值时,它会将单元格的背景更改为绿色。当没有足够的行使表格可滚动时,这种方法很有效。一旦表格变成(或从一开始就是)可滚动的,它就会开始表现出怪异的行为。它会更改已编辑项目的背景,但也会更改在向下滚动之前不可见的项目的背景。然而,当我调试时,更改背景的代码只被调用一次。我认为它与tableview有关,当is scrollable破坏并重新创建单

    • 我正在设计一个具有滚动视图的页面,其上方是表格视图(禁用滚动)。为此,我在这个问题中提到了答案 - 使UITableView不可滚动并调整高度以容纳所有单元格,但没有成功。 视图层次结构以及提供的约束- -主视图 -滚动视图< br >固定在主视图的所有边上(0,0,0,0),限制边距 -内容视图 固定到滚动视图(0,0,0,0),与主视图宽度相等,与主视图高度相等(优先级-250) -内容视图中

    • 我有一个标题,占据了整个屏幕。 每次应用程序进入后台,然后回到前台/活动,我希望屏幕被设置回标题顶部。 我只见过与滚动到表格顶部有关的答案,这些答案使用类似于,但是不起作用,因为它只滚动回UITableView的第0行0,而不是UITableView标题的顶部。 有什么想法吗? 谢谢 编辑:尝试了这个 下面是一些值得注意的表格设置代码:

    • 我试图实现某种排序工具栏-但没有工具栏(而不是工具栏,它将是一个下拉元素,它本质上是一个RelativeLayout,其正下方有LinearLayout(下拉列表中的扩展项目),一旦按下下拉菜单,它就会在整个布局上悬停。 我考虑过实现折叠工具栏并将下拉列表放入工具栏中,但这可能不是一个好主意,因为下拉列表不是像图像视图这样的静态组件。我还在我的应用程序中使用了ActionBar,因此迁移到工具栏很

    • 我有一个android布局,它有一个,里面有很多元素。在的底部有一个,然后由适配器填充。 我遇到的问题是,android将从中排除,因为已经具有可滚动的功能。我希望与内容一样长,并且主滚动视图是可滚动的。 我怎样才能达到这种行为呢? 下面是我的主要布局: 然后以编程方式将组件添加到具有ID:的linearlayour中。下面是加载到LinearLayout中的一个视图。就是这个给我卷轴带来麻烦的。

    • 我有一个非常令人沮丧的问题,我不知道是什么问题。我构建了只包含GridView的简单XML。这个gridview应该显示从特定的URL下载的图像(ImageView ),我用我的代码检索这些图像。 因此,此应用程序的想法只是从URL下载图像并在网格视图中显示这些图像。首先,我必须说我正在使用通用图像加载器库。首先,请看一下我的获取视图代码: 问题: 上面的代码有效,它在GridView中显示图像。