当获取的数据为零时隐藏表格视图单元格,从而减少单元格大小

Posted

技术标签:

【中文标题】当获取的数据为零时隐藏表格视图单元格,从而减少单元格大小【英文标题】:hiding tableview cells when the data fetched is nil thus reducing cell size 【发布时间】:2016-07-29 08:31:41 【问题描述】:

我在集合视图单元格中有一个表格视图。表格视图显示已获取的数据。虽然,获取的数据有时为零,最终看起来像这样:

在这种情况下,公司没有 Facebook 名称。目前我正在对 tableview 单元格计数进行硬编码:

var arrayForContactList : NSMutableArray = []
override init(frame: CGRect) 
    super.init(frame: frame)
    setupViews()
    setupContactList()


func setupContactList() 

    if let phoneNumber = selectedCompany.phoneNumber 

        let dictionaryForContact = NSDictionary()
        dictionaryForContact.setValue("Phone", forKey: "Title")
        dictionaryForContact.setValue(phoneNumber, forKey: "Detail")
        arrayForContactList.addObject(dictionaryForContact)
    
    // And the rest...

    self.tableView.reloadData()


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 6

关于在tableview中显示数据:

let contactArray = ["Phone", "Website", "Email", "Twitter", "Facebook", "Instagram"]

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("CellID") as! ContactCell

    cell.contactLabel.text = arrayForContactList[indexPath.row].objectForKey("Title") as? String
    cell.contactButton.setTitle(arrayForContactList[indexPath.row].objectForKey("Detail") as? String, forState: .Normal)

    return cell

如果数据 = nil,我想要通过删除单元格来减小 tableview 的大小。然后,最重要的是,如果 tableview 中的单元格已被删除,我想减小 tableview 所在的 collectionview 单元格的大小。

【问题讨论】:

【参考方案1】:

由于您在 Collectionview 中使用 tableview,我不知道它是否适合您。任何尝试一下。

让我们从tableview中的numberOfSectionsInTableView开始

func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    return 6

使用以下代码修改您的 numberOfRowsInSection 方法。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
  if section == 0 
      return selectedCompany.phoneNumber! ? 1 : 0
  else if section == 1 
      return selectedCompany.website! ? 1 : 0
  else if section == 2 
      return selectedCompany.email! ? 1 : 0
  else if section == 3 
      return selectedCompany.twitter! ? 1 : 0
  else if section == 4 
      return selectedCompany.facebook! ? 1 : 0
  else if section == 5 
      return selectedCompany.instagram! ? 1 : 0


仅供参考 - 让我解释一下我们在做什么,我们会将每个联系方式都设置为单独的部分,每个部分都有 1 或 0,具体取决于数据的可用性

让我们跳入 cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
   let cell = tableView.dequeueReusableCellWithIdentifier("CellID") as! ContactCell
   if indexPath.section == 0 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.phoneNumber!, forState: .Normal)
   else if indexPath.section == 1 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.website!, forState: .Normal)
   else if indexPath.section == 2 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.email!, forState: .Normal)
   else if indexPath.section == 3 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.twitter!, forState: .Normal)
   else if indexPath.section == 4 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.facebook!, forState: .Normal)
   else if indexPath.section == 5 
       cell.contactLabel.text = contactArray[indexPath.row]
       cell.contactButton.setTitle(selectedCompany.instagram!, forState: .Normal)
   
   return cell

现在就是这样,取决于我们要添加联系方式的部分中行的可用性。

例如,如果我们没有 Facebook 详细信息,那么 第 4 节 将有 0 行数,如果是这样的话将不会调用加载第 4 节 cellForRowAtIndexPath

编辑:尝试使用return selectedCompany.website!.isEmpty ? 1 : 0 OR一些if条件来查找字符串是否为空。像这样

let str:String!
if str.characters.count != 0 
    return 1
else
    return 0

在我们的例子中

if selectedCompany.phoneNumber!.characters.count != 0 
    return 1
else
    return 0

【讨论】:

在 numberOfRows 部分中我得到 'String' 不符合协议 BooleanType 似乎每次都返回 1 个部分。编辑:说谎它有效。忘记添加节数。你是救世主! 欢迎卢克,如果您需要任何帮助,请告诉我。祝您有美好的一天。快乐的编码。 我在集合视图动态高度方面没有太多经验..this 可能会有所帮助。如果我发现有用的东西我会告诉你的。【参考方案2】:
return 6

您需要返回单元格的数量,如果您不想要那么多,请计算您需要多少个

【讨论】:

我知道,但即使我返回 linkArray.count,返回的单元格数量也没有区别。当数据为零时,单元格仍然显示没有任何数据 所以你返回 .count 个错误的东西,用你拥有的值创建不同的数组 这是我遇到问题的地方。如何创建一个只有零值的数组?【参考方案3】:

尝试在您的代码中添加以下方法:

    // when you get all the values call below code

    var arrayForContactList : NSMutableArray

    if let phoneNumber = selectedCompany.phoneNumber! 

        let dictionaryForContact : NSDictionary
        dictionaryForContact.setValue("Phone", forKey: "Title")
        dictionaryForContact.setValue(phoneNumber, forKey: "Detail")
        arrayForContactList.addObject(dictionaryForContact)
    
    // Likewise do this for all your fields

    self.tableView.reload()


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return arrayForContactList.count



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("CellID") as! ContactCell

    cell.contactLabel.text = arrayForContactList[indexPath.row].objectForKey("Title") as? String
    cell.contactButton.setTitle(arrayForContactList[indexPath.row].objectForKey("Detail") as? String, forState: .Normal)

    return cell

【讨论】:

我已经修改了答案,试试吧! 我遇到了各种各样的错误。请记住,这是在集合视图单元格中,而不是在视图控制器中,这使它更加棘手和复杂。 所以您也可以在集合视图数组中进行此修改,因为您的表视图是集合视图的子部分。 我编辑了我的代码。不确定在集合视图数组中修改是什么意思。 arrayForContactList 现在似乎总是返回 nil。 我的意思是说你如何显示集合视图?在修改后的代码中,您在 arrayForContactList 中没有得到任何东西?确保在收到服务器响应后调用它。

以上是关于当获取的数据为零时隐藏表格视图单元格,从而减少单元格大小的主要内容,如果未能解决你的问题,请参考以下文章

滚动时隐藏自定义表格视图单元格标签如何解决?

当单元格的高度不同时,如何在表格视图中获取所有单元格的高度?

在 iPhone 中使用开关 ON/OFF 隐藏表格视图单元格

滚动后表格视图单元格获取初始值

使用显示/减少按钮展开/折叠表格视图单元格

表格视图不显示单元格中的内容