2016-12-01 8 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

jQuery과이 같은 대리인 및 데이터 소스 오브젝트를 설정해야 작동하게하려면 ..

당신이 파일을 ViewController.m에 위임을 추가하려고 및 이와 유사한 DataSource.

@interface ViewController()<UITableViewDelegate, UITableViewDataSource> 

@end 

이제이 두 줄을보기에 추가했습니다.

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

이 마음 데이터 소스 방법의도 구현을 확인 둘 중 하나는 웹 서비스 호출/로컬 데이터베이스에서 로딩/참조를 통해 다음 ViewController에 액세스하고 TableView을 새로 고침하고 다시 [tblEvents reloadData]으로 전화하면 numberOfRowsInSection 메서드에서 cellForRowAtIndexPath으로 프로세스가 다시 시작됩니다. 메서드

+0

답장을 보내 주셔서 감사합니다. 그러나 나는 다운로드 한 프로젝트에서'numberOfRowsInSection'과'cellForRowAtIndexPath'에있는 코드를 다루지 않았습니다. 또한 만든 캘린더 각각에 이벤트 하나를 만들었습니다. 새 이벤트를 만들면 (+ 버튼을 클릭하여) 저장을 누르면 화면이 기본보기로 리디렉션됩니다. 그러면 기본보기가 현재 선택된 달력에 따라 새로 고쳐집니다. –

+0

문제를 찾고 해결할 수 있도록 기본 ViewController 코드를 공유 할 수 있습니까 –

+0

내 질문 편집을 완료했습니다. –