2016-04-14 2 views
0

Я пытаюсь заполнить TableView данными из Firebase в TableViewController ниже.Методы делегатов UITableViewController, вызываемые до viewDidLoad()

Добавляя операторы печати, я могу видеть, что следующие методы делегата вызывается перед 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

Убедитесь, чтобы перезагрузить таблицу в самом конце закрытия в '' currentUserMovies.observeEventType' в loadMovies' , в этом случае прямо вне цикла while. – BallpointBen

ответ

0

Я исправил эту проблему путем загрузки источника данных в методе viewDidLoad() и затем вызвать tableView.reloadData() в методе viewDidAppear()

1

Вы должны настроить свой рабочий стол внутри loadView вместо viewDidLoad. После загрузки вызова данных фильма reloadData на self.tableView.

+0

'переопределение FUNC loadView() { self.tableView.delegate = само self.tableView.dataSource = само }' вызвало приложение к сбою на первой строке функции. Я не уверен, как вы собираетесь настраивать табличное представление? Я очень новичок в iOS. Цените свое терпение! –

+0

При переопределении loadView вам нужно установить 'self.view' самостоятельно.Я просто понял, что вы используете 'UITableViewController', но это настраивает представление для вас, так что фактически' viewDidLoad' верен. Попытка вызывать 'reloadData' на' self.tableView'. – Dash

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 ваши данные ready.If вам необходимо получить данные асинхронно, напишите

tableView.reloadData() 

после обработке данных.

+0

Помогает ли вам – Benjamin

+0

Нет. Я понимаю, что вы говорите, но я не уверен, как это исправить. Это мое первое предприятие в iOS и Swift, поэтому я был бы признателен, если бы вы могли дать мне более подробную информацию о том, как его исправить. –

+0

измените порядок вашего метода как то, что я написал. Или добавьте метод tableView.reloadData() конец вашего метода loadMovies() – Benjamin

0

Вы используете UITableViewController, вам не нужно устанавливать делегаты или источники данных, они неявно задаются родительским (это все его значение).

Вызовите функцию loadMovies и после загрузки данных звоните по номеру super.tableView.reloadData(). Вам даже не нужно вызывать reloadData, если это только статические данные из синхронного метода, но обычно вы будете извлекать данные асинхронно из бэкэнд.

Нет проблем, возникающих при вызове методов-делегатов/datasource tableView несколько раз.

+0

Просто попробовал это, и он не заполняет таблицу. Является ли добавление к массиву проблемой? –

0

Говорят, в первую очередь, делегаты табличного представления, а затем viewDidload.

Затем вы можете использовать self.tableview.reloadRowsAtIndexPaths, в этом методе проходят хотя индексы для перезагрузки в виде таблицы.

Смежные вопросы