2013-03-09 7 views
0

저는 iOS 개발에 약간 새로운 기능이 있습니다. 이 두 메소드는 두 개의 분리 된 뷰 컨트롤러 (마스터 뷰 컨트롤러와 에디터 뷰 컨트롤러)에서 선언되고 구현되며 에디터에서 마스터로 데이터를 전달해야합니다. 마스터에는 적절한 이름으로 업데이트해야하는 테이블 뷰가 있습니다. (참고 : iPhone 용 기본 마스터 - 디테일 응용 프로그램 템플릿을 사용했습니다. 단일보기 응용 프로그램으로 수동으로 생성하지 않았습니다)편집기보기 컨트롤러를 닫은 후 UITableView가 업데이트되지 않습니다.

현재 MasterViewController 내의 UITableView는 새 셀로 업데이트되지 않습니다 . 나에게는 정말 대단한 한 주였습니다. 나는 뭔가를 놓치고 있어야합니다. 여기에 마스터 뷰 컨트롤러의 코드는 다음과 같습니다

@implementation FTMasterViewController 
@synthesize bPlusMinusField, cPlusMinusField, cTerm, bTerm; 

-(void) passTrinomial:(CCTrinomial *)tri withBPlusMinusField:(NSString *)bField withBTerm:(double)bTermField withCPlusMinusField:(NSString *)cField withCTerm:(double)cTermField { 



    //allocate the array 
    if (!self.trinomials) { 
    self.trinomials = [[NSMutableArray alloc] init]; 
    } 
    //set Master VC properties to tri fields passed in 
    self.bPlusMinusField = bField; 
    self.cPlusMinusField = cField; 
    self.bTerm = bTermField; 
    self.cTerm = cTermField; 
    NSString *trinomial = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField, bTerm, cPlusMinusField, cTerm]; 

    [self.trinomials insertObject:trinomial atIndex:0]; 

    NSLog(@"%lu", (unsigned long)[self.trinomials count]); 

} 

#pragma mark - Table View 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [self.trinomials count]; 
} 

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

    cell.textLabel.text = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField, bTerm, cPlusMinusField, cTerm]; 
    return cell; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     NSDate *object = _objects[indexPath.row]; 
     [[segue destinationViewController] setDetailItem:object]; 
    } 
} 



@end 

이것은 내가 문제를 해결하기 위해 볼 필요하다고 판단되는 코드입니다 : 분명히, 내가 구현의 나머지 부분에서 기본 대체 방법이있다.

이것은 편집기보기 컨트롤러 코드입니다. 생각이 나타 났을 때, 예, "완료"버튼은 내 메인 스토리 보드의 -handleDoneButtonPushed : 메소드에 연결됩니다.

-(IBAction)handleDoneButtonPushed:(id)sender { 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
    FTMasterViewController *masterVC = [[FTMasterViewController alloc] init]; 
    [masterVC passTrinomial:factoring withBPlusMinusField:bPlusMinusField.text withBTerm:[bTriField.text doubleValue] withCPlusMinusField:cPlusMinusField.text withCTerm:[cTriField.text doubleValue]]; 


} 

이 에디터의 뷰 컨트롤러는 단순히의 UITextField의 형태로 일부 값을 얻고, 그 클래스의 객체를 통해 마스터 뷰 컨트롤러에 떨어져 그 손을. 다시 한 번, 상단 탐색 모음에서 완료 버튼을 클릭하면 편집기보기 컨트롤러가 닫히지 만 검색된 값으로 테이블보기가 업데이트되지 않습니다.

도움을 주시면 대단히 감사하겠습니다. :)

답변

0
-(IBAction)handleDoneButtonPushed:(id)sender 
{ 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
    FTMasterViewController *masterVC = [[FTMasterViewController alloc] init]; 
    [masterVC passTrinomial:factoring 
     withBPlusMinusField:bPlusMinusField.text 
        withBTerm:[bTriField.text doubleValue] 
     withCPlusMinusField:cPlusMinusField.text 
        withCTerm:[cTriField.text doubleValue]]; 

} 

이것은 잘못된 것입니다, 당신은 이미 당신이 새로운 인스턴스를 데이터를 전달하고 이전이 상세한 값을 업데이트 할 기 대해서는 안 MasterViewController의 인스턴스를 가지고있다.

위임 패턴을 사용해야합니다.

FTEditorController에 프로토콜을 만듭니다. 당신이 EditorController의 대리인으로 MasterController를 설정하면 관심있는 이벤트가 EditorController 발생하면 Delegates in Objective-C

@protocol FTEditorControllerDelegate <NSObject> 

@optional 
- (void)editorController:(FTEditorViewController *)editorController didCompleteEditingTrinomial:(NSString *)trinomial; 

@end 

을 구현하는 방법에 대한 자세한 포스트는, 그것의 위임에 해당 이벤트를 제공합니다.

일단 삼항식을 만들면 MasterController에 전달합니다.

-(IBAction)handleDoneButtonPushed:(id)sender 
    { 
     [self dismissViewControllerAnimated:YES completion:NULL]; 
     NSString *trinomial = [NSString stringWithFormat:@"x² %@ %g %@ %g", bPlusMinusField.text, [bTriField.text doubleValue], cPlusMinusField.text, [cTriField.text doubleValue]]; 
     if([self.delegate respondsToSelector:@selector(editorController:didCompleteEditingTrinomial:)]) 
     { 
      [self.delegate editorController:self didCompleteEditingTrinomial:trinomial]; 
     } 

    } 


//FTEditorControllerDelegate implementation in MasterViewController 
- (void)editorController:(FTEditorViewController *)editorController didCompleteEditingTrinomial:(NSString *)trinomial{ 

    //allocate the array 
    if (!self.trinomials) { 
    self.trinomials = [[NSMutableArray alloc] init]; 
    } 

    //This condition is tricky, I assume you always want to display the edited 
    //trinomial expression as the first one in tableView 
    [self.trinomials insertObject:trinomial atIndex:0]; 

    //Reloads the tableView to reflect the changes 
    [self.tableView reloadData]; 

} 
+0

A-hah! 내가 잃어버린 것이 있다는 것을 알았다. 이전에 위임 패턴을 사용 했었지만이 메서드를 사용한 방법을 잘못 생각했습니다. 내가 그것을 밖으로 시도하고 어떻게 작동하는지 보자. –

+0

@HunterE. 기꺼이 도와 줘. 삼항 삽입은 당신이해야 할 일입니다. – Anupdas

+0

글쎄, -handleDoneButtonPushed : 메소드에서, 나는 이것을했다 : [self.delegate editorController : self didCompleteEditingTrinomial : trinomialString] 그리고 프로토콜을 채택하고 FTMasterViewController에서 메소드를 구현했다. 구현에 코드를 붙여 넣기 만하면되지만 테이블 뷰는 아직 업데이트되지 않습니다. 배열을 처리하기 위해 -tableView : cellForRowAtIndexPath :를 수정했지만 여전히 그렇지 않습니다. 생각? –

관련 문제