2016-12-04 116 views
0

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

请建议我在哪里做错了。这是从2天开始纠缠我的。我无法找到任何解决方案。

请在下面找到我的代码为tableview。

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

回答

0

注:我无法评论,因为我没有足够的声誉,所以我不能要求你对某些查询我有..但通过阅读你的代码,这是我可以建议的。

我可以看到你的数据已经有相当多的元素类型,例如,生产领料单,分频器,扫描仪和ECT,你heightForRow委托方法..

然而,在你cellForRow功能,你只有两种情况下,PickList和MultiSelect ...因此,所有具有不同元素类型的数据类型将返回一个带有大“默认”的单元格。

我不明白的唯一奇特的事情是,tableview似乎在第一次尝试中完美加载。因此,我想知道如何设置tableview。

如果你手动在故事板中设置它。然后第一次,当应用程序加载时,它会呈现你在UITableView中设计的任何东西,但是当你向上和向下滚动时,CellForItem方法将会启动,然后重新编写单元格,返回您在列表中看到的大“默认”单元格。

所以,如果我猜测它的权利..

然后你要做的就是简单地将所有类型的案件在cellForRow方法的switch语句是什么。

+0

我刚刚删除它们以使代码但我实际上在我的代码中有它们,但仍然发生同样的情况,我试着改变默认类型,文本类型和所有其他类型的高度,但没有任何反应,但你的假设是正确的。设置了ta使用原型单元的可视化。最初,当我向下滚动时,代码只加载14行中的10行,无法创建其他4行。我看到cellForRowAt indexPath在滚动上再次执行,但它不会创建单元格。 – Dev

+0

@NewbieIOS我看到了..所以,当你向上和向下滚动时,你是否看到很多“虚拟单元格”在控制台中打印出来? – user3608914

+0

我预见到问题可能不在于switch语句。所以,它会传播到变量variableType = fetchedElements [indexPath.row] .elementType if(variableType == nil) { variableType =“”; } – user3608914

0

你可能要考虑派遣异步& tableView.reloadData

既然我无法看到所有的代码,我建议你创建一个将里面viewDidLoad中被调用的函数。在这个函数里面,当然包括下面的行,以及你想要的tableView单元格内的任何东西。我假设你正在使用的阵列为您tableViews数据

DispatchQueue.main.async { 

tableView.reloadData 

} 
+0

请您详细说明。我不会失去现有的文本框等所有数据,如果我做tableView.reloadData? – Dev

+0

@NewbieiOS这只是刷新tableViews单元格。 tableView单元格的一个问题是,即使数据存在,它也会在其实际显示tableView之前加载其他数据。调用异步并重新加载数据可以防止这种情况发生,如果不是立即显示,它会显示更快。希望这有助于 –

+0

我应该在哪里使用上面的语句? – Dev

相关问题