2013-09-22 72 views
0

我有一個場景,我的tableview重新加載不工作。請讓我知道,如果我已經正確地建模我的設計,或者我需要改變它。Tableview重新加載不能用於父VC/Child VC場景

  • 我具有芯視圖控制器和每個選項卡欄視圖控制器從該芯視圖控制器
  • 繼承每個標籤欄視圖控制器具有的tableview並實現的UITableViewDelegate和UITableViewDataSource協議。
  • 如果該應用程序是第一次啓動,在覈心視圖控制器的viewDidLoad中,我有一個方法來從Web獲取數據。在子視圖控制器的viewDidLoad方法中,我有一個填充tableview數據源的方法。
  • 所以問題是在第一次啓動時,數據在Core數據中被成功獲取並保存,但它不會重新加載tableview,因此它是空的。

因此,目前按照下面的代碼,在第一次啓動時,我看到警報視圖,然後看到加載視圖,我看到數據保存在覈心數據中。但是第一個標籤欄的表格視圖在沒有數據的情況下加載爲空,原因在於它的[重新加載沒有被調用]。但在下次啓動時,數據就在那裏。

下面是代碼

核心視圖控制器


- (void)viewDidLoad 
{ 
     [super viewDidLoad]; 
     if (!self.myManagedObjectContext) { 

    //Get Shared Instance of managedObjectContext 

    self.myManagedObjectContext = [LTDataModel sharedInstance].mainObjectContext; 

    //Check if managed object context has required data 

    ......  
    if (<data not found> { 
     [self fetchDataIntoContext]; 
    } 
} 


-(void)fetchDataIntoContext { 
     UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Initializing..." 
                message:@"This is your first launch of App" 
               delegate:nil 
             cancelButtonTitle:@"OK" 
             otherButtonTitles:nil]; 
     [message show]; 
     UIView *loadingView = [[UILoadingView alloc] initWithFrame:self.view.bounds]; 
     [self.view addSubview:loadingView]; 
     dispatch_queue_t fetchEventQ = dispatch_queue_create("Fetcher", NULL); 
     dispatch_async(fetchEventQ, ^{ 
      <add data to core data> 
     [[LTDataModel sharedInstance] save]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[self.view.subviews lastObject] removeFromSuperview]; 
     }); 
    }); 
} 

子視圖控制器


--(void)setMyArrayOfEvents:(NSMutableArray *)myArrayOfEvents { 
    if (_arrayOfMyEvents != arrayOfMyEvents) { 
     _arrayOfMyEvents = arrayOfMyEvents; 
     [self.eventTableView reloadData]; 
    } 
    } 

-(void) viewDidLoad { 
    [super viewDidLoad]; 

    //Get Shared Instance of managedObjectContext if it does not exist 
    if (!self.myManagedObjectContext) { 
     self.myManagedObjectContext = [LTDataModel sharedInstance].mainObjectContext; 
    } 
    //Populate the array which feeds the tableview 
    [self populateTableViewArrayFromContext]; 
    } 

    -(void)populateTableViewArrayFromContext 
    { 
     <Fetch data dfrom Core Data ......> 

     self.myArrayOfEvents = [[NSMutableArray alloc] initWithArray:localArray]; 
    } 

回答

0

我解決了這個問題。這個問題與Child VC的viewDidLoad沒有被調用。在數據的後臺獲取完成之前,加載視圖將被刪除。

因此,解決方案是我添加了填充核心(父)視圖控制器中的數據源數組與空身體的功能。 Child VC實現該功能。並在刪除加載視圖之前調用該方法。看看下面的代碼我在coew視圖控制器改變

CORE視圖控制器


-(void)fetchDataIntoContext { 
     UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Initializing..." 
               message:@"This is your first launch of App" 
              delegate:nil 
            cancelButtonTitle:@"OK" 
            otherButtonTitles:nil]; 
    [message show]; 
    UIView *loadingView = [[UILoadingView alloc] initWithFrame:self.view.bounds]; 
    [self.view addSubview:loadingView]; 
    dispatch_queue_t fetchEventQ = dispatch_queue_create("Fetcher", NULL); 
    dispatch_async(fetchEventQ, ^{ 
      <add data to core data> 
     [[LTDataModel sharedInstance] save]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
      **[self populateTableViewArrayFromContext];** 
     [[self.view.subviews lastObject] removeFromSuperview]; 
    }); 
    }); 
} 
    -(void)populateTableViewArrayFromContext { 
     //empty the implemetation is in Child VC 
    }