Uitableview Tableview重新加载不适用于父VC/子VC场景

Uitableview Tableview重新加载不适用于父VC/子VC场景,uitableview,Uitableview,我的tableview重新加载不起作用。请让我知道我是否正确地建模了我的设计,或者我需要更改它 我有一个核心视图控制器,每个选项卡栏视图控制器都继承自这个核心视图控制器 每个选项卡栏视图控制器都有一个tableview,并实现UITableViewDelegate和UITableViewDataSource协议 如果应用程序是第一次启动,在core view controller的viewDidLoad中,我有一个从web获取数据的方法。在子视图控制器的viewDidLoad方法中,我有一个填

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

  • 我有一个核心视图控制器,每个选项卡栏视图控制器都继承自这个核心视图控制器
  • 每个选项卡栏视图控制器都有一个tableview,并实现UITableViewDelegate和UITableViewDataSource协议
  • 如果应用程序是第一次启动,在core view controller的viewDidLoad中,我有一个从web获取数据的方法。在子视图控制器的viewDidLoad方法中,我有一个填充tableview数据源的方法
  • 所以问题是在第一次启动时,数据被成功地提取并保存在核心数据中,但它不会重新加载tableview,因此它是空的
因此,根据下面的代码,在第一次启动时,我看到警报视图,然后是加载视图,我看到数据保存在核心数据中。但第一个选项卡栏的表视图加载为空,没有数据,原因是其[reload is not called]。但在下一次发射时,数据就在那里

下面是代码

核心视图控制器


-(void)viewDidLoad
{
[超级视图下载];
如果(!self.myManagedObjectContext){
//获取managedObjectContext的共享实例
self.myManagedObjectContext=[LTDataModel sharedInstance].mainObjectContext;
//检查托管对象上下文是否具有所需的数据
......    
如果({
[自取数据到上下文];
}
}
-(void)fetchDataIntoContext{
UIAlertView*消息=[[UIAlertView alloc]initWithTitle:@“正在初始化…”
信息:@“这是您第一次发布应用程序”
代表:无
取消按钮:@“确定”
其他按钮:无];
[信息显示];
UIView*loadingView=[[UILoadingView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch\u queue\u t fetchEventQ=dispatch\u queue\u create(“Fetcher”,NULL);
调度异步(fetchEventQ^{
[[LTDataModel sharedInstance]保存];
dispatch\u async(dispatch\u get\u main\u queue()^{
[[self.view.subviews lastObject]removeFromSuperview];
});
});
}
子视图控制器


-(void)setMyArrayOfEvents:(NSMutableArray*)myArrayOfEvents{
如果(_arrayOfMyEvents!=arrayOfMyEvents){
_arrayOfMyEvents=arrayOfMyEvents;
[self.eventTableView重载数据];
}
}
-(void)viewDidLoad{
[超级视图下载];
//获取managedObjectContext的共享实例(如果不存在)
如果(!self.myManagedObjectContext){
self.myManagedObjectContext=[LTDataModel sharedInstance].mainObjectContext;
}
//填充为tableview提供数据的数组
[self-populateTableViewArrayFromContext];
}
-(void)populateTableViewArrayFromContext
{
self.myArrayOfEvents=[[NSMutableArray alloc]initWithArray:localArray];
}

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

因此,我添加了一个函数来填充核心(父)视图控制器中的数据源数组,该函数的主体为空。子VC实现了该功能。并在移除加载视图之前调用了该方法。请看下面我在coew视图控制器中更改的代码

核心视图控制器


-(void)fetchDataIntoContext{
UIAlertView*消息=[[UIAlertView alloc]initWithTitle:@“正在初始化…”
信息:@“这是您第一次发布应用程序”
代表:无
取消按钮:@“确定”
其他按钮:无];
[信息显示];
UIView*loadingView=[[UILoadingView alloc]initWithFrame:self.view.bounds];
[self.view addSubview:loadingView];
dispatch\u queue\u t fetchEventQ=dispatch\u queue\u create(“Fetcher”,NULL);
调度异步(fetchEventQ^{
[[LTDataModel sharedInstance]保存];
dispatch\u async(dispatch\u get\u main\u queue()^{
**[self-populateTableViewArrayFromContext]**
[[self.view.subviews lastObject]removeFromSuperview];
});
});
}
-(void)populateTableViewArrayFromContext{
//清空子VC中的implementation
}  
- (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];
  }
 -(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
    }