简体   繁体   中英

Swift - How to check if TableView is empty

So i'm making this ToDo-list app. This app has local notifications, but i only want them to pop-up if the tableview is empty. To keep it short : How do i check if the tableview is empty?

This is my current code :

import UIKit

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


@IBOutlet var tblTasks : UITableView!
@IBOutlet weak var countLbl: UILabel!
 var localNotification = UILocalNotification()

//For persisting data
let defaults = NSUserDefaults.standardUserDefaults()

override func viewDidLoad() {
    super.viewDidLoad()
    self.tblTasks.reloadData()


    // localNotification.alertAction = "Je hebt nog taken die gedaan moeten worden!"
    localNotification.alertBody = "Je hebt nog taken die gedaan moeten worden! Namelijk nog \(updateCount)"
    localNotification.timeZone = NSTimeZone.localTimeZone()

    localNotification.fireDate = NSDate(timeIntervalSinceNow: 10)
    UIApplication.sharedApplication().scheduleLocalNotification(localNotification)

}

override func viewWillAppear(animated: Bool) {
    self.tblTasks.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return taskMgr.tasks.count

}

//Define how our cells look - 2 lines a heading and a subtitle
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Default Tasks")

    //Assign the contents of our var "items" to the textLabel of each cell
    cell.textLabel!.text = taskMgr.tasks[indexPath.row].name
    cell.detailTextLabel!.text = taskMgr.tasks[indexPath.row].description
    cell.backgroundColor = UIColor.clearColor()

    return cell

}

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath){

    if (editingStyle == UITableViewCellEditingStyle.Delete){

        taskMgr.removeTask(indexPath.row)
        tblTasks.reloadData()
    }

}

Anyone who can help me? Thanks ;)

In Swift 3:

if tableView.visibleCells.isEmpty {
    //tableView is empty. You can set a backgroundView for it.
} else {
    //do something
}

您应该检查taskMgr.tasks.count值。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    if taskMgr.tasks.count == 0 {
       //table view is empty here
    }
    return taskMgr.tasks.count    
}

.. if TableView is empty .

There is a boolean property with the same name , to be called on the data source array.

It's true if the array contains no elements.

taskMgr.tasks.isEmpty

As mentioned in other answers, best way is to check with count of your data. But if you want to check with any other way, you can use:

if tableView.visibleCells.count == 0 {
      // tableView is empty. You can set a backgroundView for it.
      let label = UILabel(frame: CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height))
      label.text = "No Data"
      label.textColor = UIColor.blackColor();
      label.TextAlignment = .Center
      label.sizeToFit()
      tableView.backgroundView = label;
      tableView.separatorStyle = .None;
}

As it might be unsafe to query visibleCells and also ìndexPathsForVisibleCells , here's my take using solely the datasource. As an extension on UICollectionView :

import UIKit.UICollectionView

public extension UICollectionView {

    /// Returns true, if there are no items. False, otherwise.
    @inlinable var CC_isEmpty: Bool {
        guard let dataSource = self.dataSource else { return true }
        // Ideally we'd just inspect the visibleCells, but if we're checking in the false moment,
        // UICollectionView will complain about us checking while updating, so we better directly
        // refer to the data source. Unfortunately, `UICollectionView` does not have an API for `isEmpty()`.
        guard let numberOfSections = dataSource.numberOfSections?(in: self), numberOfSections > 0 else { return true }
        for section in 0..<numberOfSections {
            let entriesPerSection = dataSource.collectionView(self, numberOfItemsInSection: section)
            if entriesPerSection > 0 {
                return false
            }
        }
        return true
    }

}
UICollectionView+Emptyness.swift (END)

For a UITableView , it's almost the same code and left as an exercise to the reader.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM