2016-12-01 8 views
0

Я следил за этим tutorial из AppCoda, и я заметил, что когда я создаю другой календарь, выберите его (обозначенный галочкой рядом с ним), затем нажмите кнопку «Назад», события в главное представление UIViewController не обновляется. Я уже добавил этот код в моем ViewController.m, но ничего нового произошло:Обновить основной вид после выбора календаря и нажатия кнопки возврата

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

Есть идеи? Дайте мне знать, если вам нужна дополнительная информация.

Edit:

.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 файл попытке добавить делегата и DataSource, как это.

@interface ViewController()<UITableViewDelegate, UITableViewDataSource> 

@end 

Теперь добавьте эти две строки, на ваш взгляд, загрузился.

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

И проверить implimentation из вас методов источника данных, как этот

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

Теперь, когда ваш class/View Controller открыт вы можете иметь нулевые данные в массиве, и после некоторых манипуляций вы получили некоторые данные в массиве Либо вызовите Web-Services/Загрузка из локальной базы данных/путем передачи ссылки массива в следующий ViewController, а при возврате на экран вы хотите обновить свой TableView, так что теперь вызов [tblEvents reloadData] возобновит процесс с numberOfRowsInSection до cellForRowAtIndexPath метод

+0

Спасибо за ваш ответ. Но я действительно не манипулировал кодом в 'numberOfRowsInSection' и' cellForRowAtIndexPath' из загруженного проекта. Кроме того, я создал одно событие для каждого из моих созданных календарей. Когда я создаю новое событие (нажав кнопку +), нажмите «Сохранить», экран будет перенаправлен на главный экран, и это единственный раз, когда основное представление обновляется в соответствии с выбранным календарем. –

+0

Можете ли вы поделиться своим основным кодом ViewControllers, чтобы я мог найти и решить проблему. –

+0

Завершите редактирование моего вопроса. –