2013-09-22 2 views
0

У меня есть сценарий, когда моя перезагрузка таблицы не работает. Пожалуйста, дайте мне знать, правильно ли я смоделировал свой дизайн или мне нужно его изменить.Tableview Reload не работает для родительского сценария VC/Child VC

  • У меня ядро ​​контроллер представления, и каждая вкладка контроллер представления штриха-наследуются из этого основного контроллера представления
  • Каждые из контроллера НаПредставлениевкладки бара имеет TableView и реализует протокол UITableViewDelegate и UITableViewDataSource.
  • Если приложение запущено в первый раз, в представлении диспетчера viewDidLoad контроллера ядра, у меня есть метод для извлечения данных из Интернета. В методе viewDidLoad контроллера child view у меня есть метод, который заполняет источник данных для tableview.
  • Итак, проблема заключается в первом запуске, данные извлекаются и сохраняются успешно в данных Core, но не перезагружают таблицу, поэтому ее пустые.

Так что в настоящее время в соответствии с приведенным ниже кодом, при первом запуске я вижу вид предупреждения, а затем вид загрузки, и я вижу, что данные сохраняются в Core Data. Но таблица таблицы таблиц первой таблицы загружается пустым, без данных, и причина в том, что [перезагрузка не вызывается]. Но при следующем запуске данные есть.

Ниже приведен код

ядро ​​View Controller


- (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]; 
     }); 
    }); 
} 

Детский View Controller


--(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

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

Следовательно, я решил добавить функцию, которая заполняет массивы источников данных в ядре (родительском) контроллере представления с пустым телом. Функция Child VC реализует функциональность. И вызвал метод до того, как я удалю загрузку. Посмотрите на код ниже, что я изменил в контроллере представления coew

ОСНОВНОЙ ВИД CONTROLLER


-(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 
    } 
Смежные вопросы