テーブルビューのリロードが機能しないシナリオがあります。デザインを正しくモデリングしたか、変更する必要があるかをお知らせください。
- コア ビュー コントローラーがあり、各タブ バー ビュー コントローラーはこのコア ビュー コントローラーから継承されます。
- 各タブ バー ビュー コントローラーにはテーブルビューがあり、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];
}