我尝试使用以下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)
}
}
因此,表视图只是空行。我该如何解决这个问题?
答案 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()
来解决此问题