2016-03-30 6 views
1

Я создал инструмент постраничной из панели инструментов, снимающей этот метод:.reloadData() и .setNeedsDisplay() игнорируются

func nextPage(sender: UIBarButtonItem) { 
    let currentChapter = page.valueForKey("chapter") as! Int 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName: "Page") 
    fetchRequest.predicate = NSPredicate(format: "(chapter = %d)", currentChapter + 1) 
    do { 
     let result = try managedContext.executeFetchRequest(fetchRequest) 



     // It is here, I can clearly see we have the old object. 

     self.page = result[0] as! NSManagedObject 

     // And here I can clearly see that a new object was set. 



     self.tableView.reloadData() 
     self.view.setNeedsDisplay() 
    } catch { 
     let fetchError = error as NSError 
     print(fetchError) 
    } 
} 

Этот метод находится в моем UIViewController, который настроен следующим образом:

import UIKit 
import CoreData 

class PageViewController: UIViewController, UITableViewDelegate, UINavigationBarDelegate, UITableViewDataSource { 

// Mark: Properties 

var page:    NSManagedObject! 
var tableView  = UITableView() 
var toolBar   = UIToolbar() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.frame      = CGRectMake(0, 0, view.frame.width, view.frame.height - 50) 
    tableView.estimatedRowHeight  = 200 
    tableView.rowHeight     = UITableViewAutomaticDimension 
    tableView.scrollEnabled    = true 
    tableView.userInteractionEnabled = true 
    tableView.delegate     = self 
    tableView.dataSource    = self 
    tableView.tableHeaderView   = containerView 

    self.view.addSubview(tableView) 

Любые идеи, почему мой tableView не перезагружает свои новые данные?


Update

В соответствии с рекомендациями @Koder и @Simon, я обновил свой код, так что .. но интерфейс еще не обновляли: рекомендации

func nextPage(sender: UIBarButtonItem) { 
    let currentChapter = page.valueForKey("chapter") as! Int 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let fetchRequest = NSFetchRequest(entityName: "Page") 
    fetchRequest.predicate = NSPredicate(format: "(chapter = %d)", currentChapter + 1) 
    do { 
     let result = try managedContext.executeFetchRequest(fetchRequest) 
     self.page = result[0] as! NSManagedObject 
     dispatch_async(dispatch_get_main_queue()) { 
      self.tableView.reloadData() 
      self.view.setNeedsDisplay() 
     } 

    } catch { 
     let fetchError = error as NSError 
     print(fetchError) 
    } 
} 

Per LucaD, в Я также включу свои numberOfRows и numberOfSections:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.total 
} 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 
+0

Что значит «не перезагружать свои новые данные». Модель такая же или, даже если модель не то же самое, методы источника данных не называются? –

+0

@LucaD Я имею в виду, что пользовательский интерфейс не обновляется новым контентом. Атрибут 'page' определенно установлен для новых данных. И эти два метода называются, но пользовательский интерфейс остается неизменным. – Trip

+1

Вызывается методы 'numberOfRowsInSection' и' numberOfSection'? –

ответ

3

Вы должны стрелять все UI освежающий код в главном потоке. Для обновления Tableview, попробуйте стрелять ниже от фонового потока:

dispatch_async(dispatch_get_main_queue()) 
{ 
self.tableView.reloadData() 
} 

этот блок кода будет асинхронно получить выполняется в основном потоке.

+0

Большое спасибо за вашу помощь. Я обновил свой ответ тем, что, как я предполагаю, является правильной реализацией вашей идеи, но он все еще не работает. – Trip

+0

Я должен добавить, что 'numberOfRowsInSection' и' cellForRowAtIndexPath' действительно вызываются, поэтому я предполагаю, что функция 'reloadData()' работает ... но контент в пользовательском интерфейсе фактически не обновляется. – Trip

+0

Ах, ладно, я понял. Это произошло потому, что я не писал данные напрямую, а жестко кодировал их в другом месте. Благодаря! – Trip

2

Я подозреваю, что вам нужно переместить этот код в основной поток: изменения пользовательского интерфейса, выполненные в фоновом потоке, не будут обновлять экран. Попробуйте это:

dispatch_async(dispatch_get_main_queue()) 
{ 
    self.tableView.reloadData() 
    self.view.setNeedsDisplay() 
} 

Simon

+0

Интересно. Но где бы я это сказал? Я пытался бросить его в свой fetchRequest и другие методы, но я, вероятно, пока не понимаю этот метод. Большое спасибо за рекомендацию – Trip

+0

Просто заверните существующий код в мой 'dispatch_async'. Это приводит к тому, что методы, которые вы вызываете, выполняете в основном потоке, где должны произойти изменения пользовательского интерфейса. –

+0

А, ок. Спасибо за поддержку. Я обновил свой ответ выше тем, что, как я думаю, является тем, что вы предлагаете, но он, похоже, не работает. Может быть, я не правильно его внедряю? Спасибо, в любом случае! – Trip