0

我有一个场景,我的 tableview 重新加载不起作用。请让我知道我是否正确建模了我的设计或者我需要更改它。

  • 我有一个核心视图控制器,每个标签栏视图控制器都继承自这个核心视图控制器
  • 每个标签栏视图控制器都有一个 tableview 并实现 UITableViewDelegate 和 UITableViewDataSource 协议。
  • 如果应用程序是第一次启动,在核心视图控制器的 viewDidLoad 中,我有一个从 web 获取数据的方法。在子视图控制器的 viewDidLoad 方法中,我有一个填充 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];
  }
4

1 回答 1

0

我解决了这个问题。问题不在于 Child VC 的 viewDidLoad 没有被调用。在后台获取数据完成之前,加载视图被删除。

因此,解决方案是我添加了在核心(父)视图控制器中使用空主体填充数据源数组的函数。Child VC 实现该功能。并在我删除加载视图之前调用了该方法。查看下面我在 coew 视图控制器中更改的代码

核心视图控制器


 -(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
    }  
于 2013-09-25T17:07:51.550 回答