2016-12-01 4 views
0

これはAppCodaのtutorialに続き、別のカレンダーを作成したらそれを選択して(それの横にあるチェックマークで示されています)、メインのUIViewControllerビューは更新されません。カレンダーを選択して戻るボタンを押した後にメインビューを更新する

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    if (self.tblEvents == nil) { 
     NSLog(@"Your TableView becomes nil"); 
     return; 
    } 
    [self.tblEvents reloadData]; 
} 

任意のアイデア:私はすでに私のViewController.mが、起こった新しい何でこのコードを追加しましたか?より多くの情報が必要な場合はお知らせください。

編集:

.M

#import "MainViewController.h" 
#import "AppDelegate.h" 

@interface MainViewController() 

@property (nonatomic, strong) AppDelegate *appDelegate; 
@property (nonatomic, strong) NSArray *arrEvents; 

- (void)requestAccessToEvents; 
- (void)loadEvents; 

@end 

@implementation MainViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    self.tblEvents.delegate = self; 
    self.tblEvents.dataSource = self; 

    [self performSelector:@selector(requestAccessToEvents) withObject:nil afterDelay:0.4]; 
    [self performSelector:@selector(loadEvents) withObject:nil afterDelay:0.5]; 

    [self.tblEvents reloadData]; 
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.tblEvents reloadData]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"idSegueEvent"]) { 
     EventViewController *eventViewController = [segue destinationViewController]; 
     eventViewController.delegate = self; 
    } 
} 

#pragma mark - UITableView Delegate and Datasource method implementation 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSLog(@"%lu", (unsigned long)self.arrEvents.count); 
    return self.arrEvents.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"idCellEvent"]; 

    // Get each single event. 
    EKEvent *event = [self.arrEvents objectAtIndex:indexPath.row]; 

    // Set its title to the cell's text label. 
    cell.textLabel.text = event.title; 

    // Get the event start date as a string value. 
    NSString *startDateString = [self.appDelegate.eventManager getStringFromDate:event.startDate]; 

    // Get the event end date as a string value. 
    NSString *endDateString = [self.appDelegate.eventManager getStringFromDate:event.endDate]; 

    // Add the start and end date strings to the detail text label. 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - %@", startDateString, endDateString]; 

    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 60.0; 
} 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    // Keep the identifier of the event that's about to be edited. 
    self.appDelegate.eventManager.selectedEventIdentifier = [[self.arrEvents objectAtIndex:indexPath.row] eventIdentifier]; 

    // Perform the segue. 
    [self performSegueWithIdentifier:@"idSegueEvent" sender:self]; 
} 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the selected event. 
     [self.appDelegate.eventManager deleteEventWithIdentifier:[[self.arrEvents objectAtIndex:indexPath.row] eventIdentifier]]; 

     // Reload all events and the table view. 
     [self loadEvents]; 
    } 
} 

#pragma mark - EEventViewControllerDelegate method implementation 

- (void)eventWasSuccessfullySaved 
{ 
    // Reload all events. 
    [self loadEvents]; 
} 

#pragma mark - IBAction method implementation 

- (IBAction)showCalendars:(id)sender 
{ 
    if (self.appDelegate.eventManager.eventsAccessGranted) { 
     [self performSegueWithIdentifier:@"idSegueCalendars" sender:self]; 
    } 
} 

- (IBAction)createEvent:(id)sender 
{ 
    if (self.appDelegate.eventManager.eventsAccessGranted) { 
     [self performSegueWithIdentifier:@"idSegueEvent" sender:self]; 
    } 
} 

#pragma mark - Private method implementation 

- (void)requestAccessToEvents 
{ 
    [self.appDelegate.eventManager.eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { 
     if (error == nil) { 
      // Store the returned granted value. 
      self.appDelegate.eventManager.eventsAccessGranted = granted; 
     } else { 
      // In case of error, just log its description to the debugger. 
      NSLog(@"%@", [error localizedDescription]); 
     } 
    }]; 
} 

- (void)loadEvents 
{ 
    if (self.appDelegate.eventManager.eventsAccessGranted) { 
     self.arrEvents = [self.appDelegate.eventManager getEventsOfSelectedCalendar]; 

     [self.tblEvents reloadData]; 
    } 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 
+0

UITableViewのデリゲートを設定しましたか? –

+0

こんにちは@SyedeHussaini。私はちょうどiOSプログラミングを学び始めました。あなたの質問はどういう意味ですか? –

+0

あなたはそのチュートリアルを終えましたか? – Mahesh

答えて

0

のUITableViewは、あなたがこのようなデリゲートとデータソースオブジェクトを設定する必要が動作するように...

あなたにファイルをViewController.mデリゲートを追加しようこのようなデータソース。

@interface ViewController()<UITableViewDelegate, UITableViewDataSource> 

@end 

あなたのビューにこれらの2行が追加されました。

self.tblEvents.delegate = self; 
self.tblEvents.dataSource = self; 

そして、あなたのclass/View Controllerが開いているときは、この

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    //This method should return the number of rows you want to create in your tableView 
    return yourArray.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"yourCellIdentifier"]; 
//Now show what you want to show in your each cell? For Example you just want to show a simple text which is stored in you array. 
cell.textLabel.text = [yourArray objectAtIndex:indexPath.row]; 
//indexPath.row is the numeric index number of each cell. This method will automatically execute exact the same number of time you return in above method. 
return cell; 
} 

のようなあなたのデータソースメソッドのimplimentationをチェックする今、あなたはあなたの配列にゼロデータを持っている可能性があり、いくつかの操作をした後、あなたの配列にいくつかのデータを得ましたどちらかのWebサービスを呼び出す/ローカルデータベースからの読み込み/配列の参照を次のViewControllerに渡して画面に戻ってきたらTableViewを更新して[tblEvents reloadData]を呼び出すとnumberOfRowsInSectionメソッドからcellForRowAtIndexPathにプロセスが再開されます。メソッド

+0

あなたの答えをありがとう。しかし、実際には、ダウンロードしたプロジェクトから 'numberOfRowsInSection'と' cellForRowAtIndexPath'のコードを操作しませんでした。また、作成したカレンダーごとに1つのイベントを作成しました。新しいイベントを(+ボタンをクリックして)作成してからSaveを押すと、画面はメインビューにリダイレクトされ、現在選択されているカレンダーに従ってメインビューが更新されます。 –

+0

問題を見つけて解決できるように、メインのViewControllerコードを共有できますか? –

+0

私の質問を編集しました。 –

関連する問題