在viewDidLoad()之前调用的UITableViewController委托方法

时间:2016-04-14 03:15:02

标签: ios swift uitableview

我尝试使用以下TableView中Firebase的数据填充TableViewController

通过添加print语句,我可以看到在viewDidLoad()之前调用了以下委托方法,这是我加载数据的地方:

  • func numberOfSectionsInTableView
  • func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
  • func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

    import UIKit
    import Firebase
    import SwiftyJSON
    
    class MovieTableViewController: UITableViewController {
    
    //MARK: Properties
    
    var movies = [Movie]()
    
    override func viewDidLoad() {
    self.tableView.delegate = self
    self.tableView.dataSource = self
    loadMovies()
    print("I'm called before delegate methods")
    print(self.movies.count)
    super.viewDidLoad()
    
    
    
    // Use the edit button item provided by the table view controller.
    navigationItem.leftBarButtonItem = editButtonItem()
    
    
    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false
    
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    //         self.navigationItem.rightBarButtonItem = self.editButtonItem()
    
    }
    
    override func viewDidAppear(animated: Bool) {
        print(movies.count)
    }
    
     func loadMovies() {
        print("Loading movies")
        currentUserMovies.observeEventType(FEventType.Value, withBlock: { snapshot in
            let enumerator = snapshot.children
            var image = UIImage()
            while let child = enumerator.nextObject() as? FDataSnapshot {
                let name = child.key
                let userRating = child.childSnapshotForPath("User Rating").value as! Int
                let imdbRating = child.childSnapshotForPath("IMDB Rating").value as! String
                let plot = child.childSnapshotForPath("Plot").value as! String
                let imagePath = child.childSnapshotForPath("Image").value as! String
                if let url = NSURL(string: imagePath) {
                    if let data = NSData(contentsOfURL: url) {
                        image = UIImage(data: data)!
                    }
                }
    
                let movie = Movie(name: name, userRating: userRating, image: image, plot: plot, imdbRating: imdbRating)!
                self.movies.append(movie)
    
            }
            print(self.movies.count)
        })
    }
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print(self.movies.count)
        print("tableView returning movie count was called")
        return self.movies.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        print("This is called too!")
        let cellIdentifier = "MovieTableViewCell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MovieTableViewCell
        let movie = movies[indexPath.row]
        cell.movieName.text = movie.name
        print(movie.name + "name here")
        cell.movieImage.image = movie.image
        cell.movieRating.rating = movie.userRating
        return cell
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.tableView.contentInset = UIEdgeInsetsMake(0,0,55,0)
    }
    
    
    
    }
    

因此,表视图只是空行。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:1)

您应该在loadView而非viewDidLoad内设置工作台视图。在reloadData上加载电影数据电话self.tableView

答案 1 :(得分:1)

override func viewDidLoad() {
    super.viewDidLoad()

    loadMovies()
    self.tableView.delegate = self
    self.tableView.dataSource = self

    print("I'm called before delegate methods")
    print(self.movies.count)
}

这可能会对您有所帮助,您需要在显示之前准备好数据。

 self.tableView.dataSource = self

告诉你的tableView你的数据已准备就绪。如果需要异步获取数据,请写

tableView.reloadData() 

处理完数据后。

答案 2 :(得分:0)

您正在使用UITableViewController,您不需要设置委托或数据源,它们由父级隐式设置(这是它的全部要点)。

调用loadMovies函数,加载数据后调用super.tableView.reloadData()。如果它只是来自同步方法的静态数据,你可能甚至不需要调用reloadData,但通常你会从后端异步地获取数据。

多次调用tableView委托/数据源方法没有问题。

答案 3 :(得分:0)

首先要调用tableview委托,然后调用viewDidload。

然后你可以使用self.tableview.reloadRowsAtIndexPaths,在这个方法中传递索引以在表视图中重新加载。

答案 4 :(得分:0)

我通过在viewDidLoad()方法中加载数据源,然后在tableView.reloadData()方法中调用viewDidAppear()来解决此问题