2016-12-01 62 views
0

我從AppCoda跟隨此tutorial,我注意到當我創建另一個日曆時,選擇它(通過旁邊的複選標記指示),然後點擊後退按鈕,主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 
+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; 

,並檢查您的數據源方法,這樣

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

+0

感謝您的回答。但是我沒有真正操作下載項目中的'numberOfRowsInSection'和'cellForRowAtIndexPath'中的代碼。另外,我在每個創建的日曆上創建了一個事件。當我創建一個新事件(通過點擊+按鈕)然後點擊保存,屏幕將重定向到主視圖,那麼這是根據當前選擇的日曆刷新主視圖的唯一時間。 –

+0

你可以分享你的主要ViewControllers代碼,以便我可以找到並解決問題 –

+0

完成編輯我的問題。 –