带有自定义表格视图单元的表格视图在滚动时消失

3
我有一个带有自定义表格视图单元的表格视图。 每个单元可能具有不同的高度。 总共有14行,但其他行是不可见的,当我向上和向下滚动时,这些行会消失。
请建议我哪里做错了。这已经困扰我两天了,我找不到任何解决方案。
请在下面找到我的表格视图代码。
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
    return UITableViewAutomaticDimension

}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if(fetchedElements[indexPath.row].elementType=="textarea")
    {
        return 100 ;
    }
    else if (fetchedElements[indexPath.row].elementType=="picklist")
    {
        return 60;
    }
    else if (fetchedElements[indexPath.row].elementType=="divider")
    {
        return 30;
    }
    else if (fetchedElements[indexPath.row].elementType=="scanner")
    {
        return 50;
    }
    else if (fetchedElements[indexPath.row].elementType=="multiselect")
    {
        return 60;
    }
    else if(fetchedElements[indexPath.row].elementType=="text")
    {
       var length =  fetchedElements[indexPath.row].elementText?.characters.count
        if length! < 30
        {
            return 80;
        }else if length! < 60 && length! > 30  {
            return 110;
        }else if(length! < 100 && length! > 60)
        {
            return 130;
        }else if(length! < 150 && length! > 100 )
        {
        return 170;
        }
        else{
            return 140;
        }
    }else
   {
        return 200;

    }

}


func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
{
    return UITableViewAutomaticDimension

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    print("No of elements Fetched===\(fetchedElements.count)")
    return fetchedElements.count
}

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


var variableType =  fetchedElements[indexPath.row].elementType
    if(variableType==nil)
    {
      variableType = "";
    }

var elementType = variableType!

    print("=============Element Type=\(elementType)==============")

   let frame = UIScreen.main.bounds

    switch elementType {
    case "picklist":

        let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox

        dpcell.backgroundColor = UIColor.lightGray
        dpcell.txtValue.layer.cornerRadius = 3


        dpcell.LabelName.text = "Country"//fetchedElements[indexPath.row].elementText
        dpcell.txtValue.tag =  Int(fetchedElements[indexPath.row].elementId)
        dpcell.txtValue.addTarget(self, action: #selector(GoToDropdown), for: UIControlEvents.touchDown)
        dpcell.txtValue.backgroundColor = UIColor.white
        dpcell.txtValue.titleLabel?.numberOfLines = 0
        dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true;
        dpcell.LabelName.lineBreakMode = .byWordWrapping
        dpcell.LabelName.numberOfLines = 0
        dpcell.selectionStyle = .none
        print("============picklist==========\(indexPath.row)")
        return dpcell
    case "multiselect":
        let dpcell = Bundle.main.loadNibNamed("Textbox", owner: self, options: nil)?.first as! Textbox

        dpcell.backgroundColor = UIColor.lightGray
        dpcell.txtValue.layer.cornerRadius = 3
        dpcell.LabelName.text = fetchedElements[indexPath.row].elementText
        dpcell.txtValue.tag =  Int(fetchedElements[indexPath.row].elementId)
        dpcell.txtValue.addTarget(self, action: #selector(GoToMultiSelect), for: UIControlEvents.touchDown)
        dpcell.txtValue.backgroundColor = UIColor.white
        dpcell.txtValue.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left
        dpcell.txtValue.titleLabel?.numberOfLines = 0
        dpcell.txtValue.titleLabel?.adjustsFontSizeToFitWidth = true;
        dpcell.selectionStyle = .none
         print("===========multiselect===========\(indexPath.row)")

        return dpcell

     default:
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! UITableViewCell
        cell.textLabel?.text = "default"
         print("==========dummy cell============\(indexPath.row)")
        return cell

}

这里输入图片描述

这是在向下滚动并向上滚动后发生的。

这里输入图片描述

2个回答

1
注意:由于我声望不足,无法评论,因此我无法询问您有关某些查询的问题。但通过阅读您的代码,这就是我可以建议的。
我可以看到您的数据具有相当多的元素类型,例如Picklist、分隔符、扫描仪等,在您的heightForRow委托方法中。
然而,在您的cellForRow函数中,只有两种情况,PickList和MultiSelect... 因此,所有具有不同元素类型的数据类型都将返回一个带有大“默认值”的单元格。
我唯一不理解的奇怪之处是,TableView似乎在第一次尝试中已经完美加载了。因此,我想知道您如何设置TableView。
如果您手动在Storyboard中设置它。那么,第一次加载应用程序时,它将呈现您在UITableView中设计的任何内容,但是一旦您上下滚动,CellForItem方法将启动并重新编写单元格,返回您在列表中看到的大“默认”单元格。
所以如果我猜对了...
那么您要做的就是简单地在cellForRow方法的switch语句中添加所有类型案例。

我只是为了让代码看起来更简洁而将它们删除了,但实际上它们仍在我的代码中。但问题仍然存在。我尝试更改默认类型、文本类型和所有其他类型的高度,但没有任何效果。但你的假设是正确的。我使用原型单元格设置了tableview。最初,当我向下滚动时,代码仅加载了14行中的10行,无法创建其他4行。我看到cellForRowAt indexPath在滚动时再次执行,但它不会创建单元格。 - DEV
@NewbieIOS 我明白了。那么,当你上下滚动时,控制台中是否会打印出很多“虚拟单元格”? - user3608914
我预见到问题可能不在于switch语句...所以它会向上传递到var variableType = fetchedElements[indexPath.row].elementType。如果variableType为空,则将其赋值为“”。 - user3608914
你可以尝试检查元素类型,即使在滚动后也要确认它们是否正确。你可以在UIScrollViewDidScroll代理方法中进行测试(仅作为示例),以查看当你向上或向下滚动时数据的元素类型如何变化。 - user3608914
我观察到的是,tableview最初加载了N行...之后,当我向下滚动以获取更多行时, fetchedElements = try moc.fetch(elementFetch as! NSFetchRequest<NSFetchRequestResult>) as! [Element] 返回的fetchedElements对象为空...因此,tableviewcells没有形成。我该怎么解决? - DEV
显示剩余4条评论

0

你可能需要研究dispatch async和tableView.reloadData

由于我无法看到你的所有代码,建议你创建一个函数,在viewDidLoad中调用该函数。在这个函数内部,当然包括下面的代码行,以及你想要放在tableView单元格内部的任何内容。我假设你正在使用数组来存储tableView的数据。

DispatchQueue.main.async { 

tableView.reloadData

}

请您详细说明一下。如果我执行tableView.reloadData,那么文本框等现有的所有数据不会丢失吗? - DEV
@NewbieiOS 这只是简单地刷新了tableView的单元格。tableView单元格的一个问题是,即使数据已经存在,有时它也会在实际显示在tableView之前加载其他数据。调用dispatch async和reload data将防止这种情况发生,使其更快地显示,甚至可以立即显示。希望这可以帮到你。 - Daniel Dramond
我应该在哪里使用上述语句? - DEV
@NewbieIOS 在你的代码中加入以下函数:func reloadTableView() { DispatchQueue.main.async { tableView.reloadData() } }然后在你的viewDidLoad函数中调用reloadTableView()即可。 - Daniel Dramond
如果我使用这个,它只会重新加载空行。 - DEV
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/129749/discussion-between-newbieios-and-daniel-dramond。 - DEV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接