2013-03-17 72 views
2

我試圖刷新在視圖控制器(視圖控制器1)上使用核心數據的tableview上的數據。用於將值保存到核心數據中的保存按鈕(UIButton)位於不同的視圖控制器(視圖控制器2)上。從另一個類重新加載核心數據表視圖

他們都在同一時間對iPad在同一屏幕上,但有單獨的類(頭和主文件)通過集裝箱意見。當我點擊視圖控制器1上的保存按鈕時,它不刷新視圖控制器2上的表格視圖。

但是,我知道這不是它將數據保存到核心數據的方式,因爲當我刷新應用程序時,新的單元格就像它應該的那樣在表格視圖中彈出。我曾嘗試以下方法來嘗試並獲得表視圖,沒有運氣刷新:

// ViewController1.m (Save Button) 

- (IBAction)saveMethod { 

    //Core Data Save Method Goes Here (Irrelevant) 

    [self.managedObjectContext save:nil]; 

    //ViewController2 has the table view 
    ViewController2 *trackingView = [[ViewController2 alloc] init]; 

    trackingView.managedObjectContext = self.managedObjectContext; 
    [trackingView setupFetchedResultsController]; 
    [trackingView.view setNeedsDisplay]; 
    [trackingView.table reloadData]; 
} 

我似乎無法弄清楚如何講這個表視圖,從不同的視圖控制器自動刷新。

回答

2

你並不需要重新創建視圖控制器,你現在做的事情。

NSManagedObjectContext完成保存操作,它張貼通知。您可以有任何對象註冊來接收這些通知。如果重新設置fetchedResultsController的代理人不是一個選項(即ViewController1已被設置爲代理人,並且ViewController1繼續充當代表人),請考慮此問題。

ViewController2將需要對正在處理數據的託管對象上下文的引用,因此您需要創建一個屬性並對其進行適當設置(@property NSManagedObjectContext *moc)。

然後,在viewDidLoad它可以register for notifications

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(handleNotification:) 
              name:NSManagedObjectContextDidSaveNotification 
              object:self.moc]; 

ViewController2必須定義一個方法handleNotification:

  1. 當你:

    -(void)handleNotification:(NSNotification*)notification { 
        if ([notification.name isEqual:NSManagedObjectContextDidSaveNotification] && [notification.object isEqual:self.moc]) { 
         [self.tableView reloadData]; 
        } 
    } 
    

    對這種做法有幾個注意事項視圖控制器已被解僱,請務必致電[[NSNotificationCenter defaultCenter] removeObserver:self]。通知中心保留觀察員(我發現困難一次)。

  2. 註冊通知時始終包含託管對象上下文,您不希望響應每個保存通知。
+0

我嘗試了以下方法。似乎它應該工作,但它沒有。如果在View Controller 2中我需要創建另一個屬性我已經有一個managedObjectContext屬性?因爲我通過添加而不是「self.moc」來嘗試它,所以我做了「self.managedObjectContext」,但這不起作用 – Zack 2013-03-17 16:45:40

+0

您不應該需要創建另一個屬性,並且實際的命名無關緊要。只要兩個視圖控制器中的'managedObjectContext'指向同一個對象。 – 2013-03-17 16:52:56

+0

是的,這就是我的想法。兩個managedObjectContext都指向App Delegate – Zack 2013-03-17 19:21:20

0

你可能不希望在你的目標是你已經刷新實例來創建的ViewController2一個新的實例。事實上,你的問題在ViewController2,不在這裏。

確保ViewController2設置爲其獲取結果控制器的委託,然後從獲取的結果控制器委託回調中更新您的表視圖。並確保兩個視圖控制器都在查看相同的託管對象上下文。

+0

你能解釋一下我怎樣通過設置它作爲一個代表來使用它嗎? – Zack 2013-03-17 02:04:15

+0

您是否閱讀過「NSFetchedResultsControllerDelegate」的文檔?在你獲得的回調和'UITableView'上的更新方法之間幾乎有一對一的映射關係。 – 2013-03-17 02:13:40

相關問題