如何构建具有特定行数的表格视图?
Posted
技术标签:
【中文标题】如何构建具有特定行数的表格视图?【英文标题】:How to build a Table View with specific number of rows? 【发布时间】:2018-01-11 11:33:30 【问题描述】:我一直在阅读类似的问题,直到现在都没有解决这个错误,或者我还没有找到它。
我有一个 TableView,我需要表格有特定的行数。
现在它可以处理来自数组的通知计数。在这个数组中,我保留了来自服务器的通知。 但我希望如果这个数组计数大于 40,则行数为 40,它们不是数组的计数。
这是我的代码:
class ClassName: UITableViewController, UITabBarControllerDelegate
public var notifications: [APINotification] = []
override func viewDidLoad()
super.viewDidLoad()
self.tabBarController?.delegate = self
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
override func viewDidAppear(_ animated: Bool)
self.notifications = []
self.getLastNotifications()
APIAuth.shared.count_badge = 0
self.tabBarController?.tabBar.items![0].badgeValue = nil
public func getLastNotifications()
let req = Notification()
req.getLastNotifications(onComplete: events in
self.notifications = events
DispatchQueue.main.async(execute:
self.tableView.reloadData()
)
)
override func numberOfSections(in tableView: UITableView) -> Int
return self.notifications.count
// There is just one row in every section
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 1
// Set the spacing between sections
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 10
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let event = self.notifications[indexPath.section]
let cell = tableView.dequeueReusableCell(withIdentifier: "controller", for: indexPath) as! Controller
cell.bodyLbl.text = event.description
cell.typelbl.text = event.type
cell.typelbl.sizeToFit()
cell.titleLbl.text = event.title
cell.subjectLbl.text = event.subject?.name
return cell
感谢您的帮助!
【问题讨论】:
【参考方案1】:您可以将此方法更改为:
override func numberOfSections(in tableView: UITableView) -> Int
return self.notifications.count > 40 ? 40 : self.notifications.count
这将显示与您从通知中获得的行数一样多的行,但如果它大于 40,它将仅显示 40。要使其始终显示 40,只需将 return 40 改为,但这可能会使您的应用程序崩溃,数组将包含少于 40 个的项目。
Ps 你显示 40 个部分,没有行将其更改为行,而是你需要机会你的代码:
override func numberOfSections(in tableView: UITableView) -> Int
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return self.notifications.count > 40 ? 40 : self.notifications.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let event = self.notifications[indexPath.row]
...
【讨论】:
谢谢,完美!我有个疑问。您的代码和此代码有什么区别:覆盖 func numberOfSections (in tableView: UITableView) -> Int var count = self.notifications.count if (count> 4) count = 4 return down ?什么是正确的解决方案,或者可以像这两种形式那样做? 没有区别,我相信编译器的输出在两个例子中都是一样的。有多种方法可以达到类似的结果。有关更多选项,请参阅@Upholder Of Truth 答案。所有这些都会给你相同的结果。【参考方案2】:有几种方法可以实现这一点:
简单明了:
return min(self.notifications.count, 40)
一种快速的方法:
guard self.notifications.count < 40 else
return 40
return self.notifications.count
另一个更详细的版本:
return self.notifications.count < 40 ? self.notifications.count
另一个更简单的版本:
if self.notifications.count > 40
return 40
else
return self.notifications.count
使用您认为最适合目的的版本。
如果我觉得自己很 Swifty(甚至是一个词),我可能会选择 1 或 2。
【讨论】:
感谢您在回复中提供的多个选项。它们对我很有用。【参考方案3】:试试下面的代码:
// There is just one row in every section
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if self.notifications.count > 40
return 40
return self.notifications.count
【讨论】:
【参考方案4】:要限制最大节数,只需检查数组大小:
override func numberOfSections(in tableView: UITableView) -> Int
var count = self.notifications.count
if (count > 40)
count = 40
return count
【讨论】:
以上是关于如何构建具有特定行数的表格视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何从具有多个数组的字典中获取特定键并存储到放置在表格视图单元格中的字符串中