0

テーブルビューのリロードが機能しないシナリオがあります。デザインを正しくモデリングしたか、変更する必要があるかをお知らせください。

  • コア ビュー コントローラーがあり、各タブ バー ビュー コントローラーはこのコア ビュー コントローラーから継承されます。
  • 各タブ バー ビュー コントローラーにはテーブルビューがあり、UITableViewDelegate および UITableViewDataSource プロトコルを実装しています。
  • アプリを初めて起動する場合、コア ビュー コントローラーの viewDidLoad には、web からデータをフェッチするメソッドがあります。子ビュー コントローラーの viewDidLoad メソッドには、テーブルビューのデータ ソースを設定するメソッドがあります。
  • そのため、問題は最初の起動時にあり、データはフェッチされ、Core データに正常に保存されますが、テーブルビューがリロードされないため、空になります。

したがって、現在、以下のコードに従って、最初の起動時に警告ビューが表示され、次に読み込みビューが表示され、データが Core Data に保存されていることがわかります。しかし、最初のタブ バーのテーブル ビューは、データがなく空の状態で読み込まれます。その理由は、[リロードが呼び出されていない] ためです。しかし、次の起動時にはデータがそこにあります。

以下はコードです

コア ビュー コントローラー


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

問題を解決しました。問題は、子 VC の viewDidLoad が呼び出されていないことではありませんでした。データのバックグラウンド フェッチが完了する前に、読み込み中のビューが削除されます。

したがって、解決策は、コア (親) ビュー コントローラーのデータ ソース配列に空の本体を設定する関数を追加することでした。子 VC は機能を実装します。ローディングビューを削除する前にメソッドを呼び出しました。coew View 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
    }  
于 2013-09-25T17:07:51.550 に答える