选择日历并按下后退按钮后刷新主视图

时间:2016-12-01 06:54:57

标签: ios objective-c calendar refresh back

我从AppCoda跟踪了这个tutorial,我注意到当我创建另一个日历时,选择它(由旁边的复选标记表示),然后点击Back按钮,主UIViewController视图中的事件不会刷新。我已经在我的ViewController.m中添加了此代码,但没有发生新的事情:

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

有什么想法吗?如果您需要更多信息,请与我们联系。

编辑:

的.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

1 个答案:

答案 0 :(得分:0)

要使UITableView正常工作,您需要像这样设置委托和数据源对象..

在你的ViewController.m文件中尝试像这样添加Delegate和DataSource。

@interface ViewController ()<UITableViewDelegate, UITableViewDataSource>

@end

现在在视图中添加这两行并加载。

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

并检查您这样的数据源方法的实现

- (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服务/从本地数据库加载/通过传递数组引用下一个ViewController,当您回到屏幕时,您想要刷新TableView,因此现在调用[tblEvents reloadData]会重新启动从numberOfRowsInSection方法到cellForRowAtIndexPath方法的流程