如何构建具有特定行数的表视图?

时间:2018-01-11 11:33:31

标签: ios swift xcode swift3

我一直在阅读类似的问题,直到现在都没有解决这个错误或者我没有找到它。

我有一个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
    } }

感谢您的帮助!

4 个答案:

答案 0 :(得分:6)

您可以将此方法更改为:

override func numberOfSections(in tableView: UITableView) -> Int {
    return self.notifications.count > 40 ? 40 : self.notifications.count
}

这将显示您从通知中获得的行数,但如果它大于40,则只会显示40行。要使其始终显示40,只需将40返回,但这可能会导致您的应用崩溃它的数组将包含的项目少于40个。

您显示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]
    ...
}

答案 1 :(得分:3)

有几种方法可以实现这一目标:

  1. 简单明了:

    return min(self.notifications.count, 40)
    
  2. Swifty方法:

    guard self.notifications.count < 40 else {
        return 40
    }
    
    return self.notifications.count
    
  3. 另一个更详细的版本:

    return self.notifications.count < 40 ? self.notifications.count
    
  4. 另一个更简单的版本:

    if self.notifications.count > 40 {
        return 40
    } else {
        return self.notifications.count
    }
    
  5. 使用哪种版本最适合您的目的。

    如果我觉得自己都是Swifty(甚至一句话),我可能会选择1或2。

答案 2 :(得分:2)

请尝试以下代码:

// 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
}

答案 3 :(得分:1)

要限制最大部分数,只需检查数组大小:

override func numberOfSections(in tableView: UITableView) -> Int {
    var count = self.notifications.count
    if (count > 40) {
        count = 40
    }
    return count
}