当获取的数据为零时隐藏表格视图单元格,从而减少单元格大小
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 中没有得到任何东西?确保在收到服务器响应后调用它。以上是关于当获取的数据为零时隐藏表格视图单元格,从而减少单元格大小的主要内容,如果未能解决你的问题,请参考以下文章
当单元格的高度不同时,如何在表格视图中获取所有单元格的高度?