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

时间:2016-12-04 17:05:45

标签: swift uitableview swift3 tableview

我有一个带有自定义tableview单元格的表视图。 每个可能有不同的高度。 总共有14行,但其他行不可见,当我向上和向下滚动时,行正在消失。

请建议我在哪里做错了。这让我困扰了2天。我无法找到任何解决方案。

请在下面找到我的代码查看表格。

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

}

enter image description here

向下和向上滚动后会发生这种情况

enter image description here

2 个答案:

答案 0 :(得分:1)

注意:我无法发表评论,因为我没有足够的声誉,所以我不能问你有关我的某些问题......但是通过阅读你的代码,这就是我所能提出的建议。

我可以在你的heightForRow委托方法中看到你的数据有很多元素类型,例如,Picklist,divider,scanner等等。

但是,在你的cellForRow函数中,你只有两种情况,PickList和MultiSelect ...因此,具有不同元素类型的所有数据类型将返回一个上面有一个大“默认”的单元格。

我不理解的唯一奇怪的事情是桌面视图似乎在第一次尝试中完美加载。因此,我想知道你如何设置tableview。

如果你在storyboard中手动设置它。那么第一次,当应用程序加载时,它将显示你在UITableView中设计的任何内容,但是当你向上和向下滚动时,CellForItem方法将启动,并重新写入单元格,返回列表中显示的大“默认”单元格。

所以,如果我猜对了..

然后你要做的就是在cellForRow方法的switch语句中添加所有类型的情况。

答案 1 :(得分:0)

您可能希望查看dispatch async&amp; tableView.reloadData

由于我看不到你的所有代码,我建议你创建一个将在viewDidLoad中调用的函数。在这个函数中,当然包括下面的行,以及tableView单元格中你想要的任何内容。我假设您正在为tableViews数据使用数组

DispatchQueue.main.async { 

tableView.reloadData

}