2016-03-30 1 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が新しいデータをリロードしていない理由はありますか?


更新

@Koderと@Simonによって推奨されているように、私はので、私のコードを更新しました..しかし、UIはまだ更新されませんでした:

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) 
    } 
} 

パーLucaDの勧告、 numberOfRowsnumberOfSectionsを含めます:

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

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

「新しいデータを再読み込みしていません」とどういう意味ですか?モデルが同じか、モデルが同じではない場合でも、データソースのメソッドは呼び出されません。 –

+0

@ルーファ私はUIが新しいコンテンツで更新されていないことを意味します。 'page'属性は確実に新しいデータに設定されます。これらの2つのメソッドは呼び出されますが、UIは同じままです。 – Trip

+1

'numberOfRowsInSection'と' numberOfSection'メソッドが呼び出されていますか? –

答えて

3

あなたは、メインスレッド上のすべてのUIさわやかなコードを発射する必要があります。 のtableViewを更新するために、バックグラウンドスレッドから下に焼成してみてください:

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

このコードブロックは、非同期的にメインスレッド上で実行されます。

+0

ご協力いただきありがとうございます。あなたのアイデアが正しく実装されていると仮定して自分の答えを更新しましたが、まだ動作しません。 – Trip

+0

'numberOfRowsInSection'と' cellForRowAtIndexPath'が実際に呼び出されているので、 'reloadData()'関数が動作していると仮定していますが、UIの内容は実際には更新されません。 – Trip

+0

ああ私はそれを手に入れました。データを直接書き込むのではなく、他の場所でハードコーディングしていたからです。ありがとう! – Trip

2

そのコードをメインスレッドに移動する必要があると思われます。バックグラウンドスレッドでUIを変更しても画面は更新されません。これを試してみてください:

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

サイモン

+0

興味深い。しかし、私はどこにこれを置くだろうか?私はfetchRequestと他のメソッドでそれを投げてみましたが、まだこのメソッドを理解していない可能性があります。ありがとうございます。 – Trip

+0

私の 'dispatch_async'に既存のコードをラップしてください。これにより、UIの変更が必要なメインスレッドで呼び出すメソッドが実行されます。 –

+0

ああ。ご協力ありがとうございました。私はあなたの提案していると思うもので上記の私の答えを更新しましたが、まだ動作していないようです。私はそれを正しく実装していないのでしょうか?とにかくありがとう! – Trip

関連する問題