2012-01-18 1 views
3

모달보기에서 변경 한 후에 상위보기에서 UILabel을 업데이트하려고합니다. 따라서 "저장"을 클릭하면 새로 입력 한 값에 따라 부모보기 컨트롤러에 표시되는 텍스트가 변경됩니다.모달보기를 닫을 때 상위보기 컨트롤러에서 UILabel을 업데이트하려고합니다.

하지만 UILabel에서 새로 입력 한 값을 새로 고치는 것처럼 보이지 않습니다.

내가 시도 할 수있는 아이디어가 있습니까? 나는 몇 가지 시도를했지만보기가 이미로드되어 있고 "새로 고침"되는 것이 없습니다.

감사합니다.

+0

I을 위임 방법을 만들 것입니다. "저장"버튼을 누르면 모달이 해제되고 위임 메서드가 호출됩니다. 부모 뷰에는이 위임 메서드가 구현되어 있으며이를 호출하면 레이블이 새로 고쳐집니다. – simonbs

답변

8

이렇게하는 방법에는 여러 가지가 있습니다. 한 가지 방법은 NSNotificationCenter을 사용하여 서로 다른 클래스 간의 호출을 수행하는 것입니다. 그래서 부모에 (호출 updateLabel 수) 업데이트에 대한 책임 기능을해야합니다 확인하고 다음을 수행합니다 :

:

지금 다른 관점에서
- (void) updateLabel 
{ 
    yourLabel.text = @"what you need"; 
} 

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateLabel) name:@"DoUpdateLabel" object:nil]; 
} 

단순히 저장 버튼에 알림을 게시을

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoUpdateLabel" object:nil userInfo:nil]; 

편집 : 항상 쉬를하는 것이 바람직하다이 시나리오에서는

  1. : 여기 두 가지를 언급해야 프로그램의 모든보기에서이 데이터에 액세스 할 수 있도록 데이터를 저장하는 데이터 모달입니다. 즉, 클래스와 데이터를 분리하는 것이 좋습니다.
  2. SWIFT에 [[NSNotificationCenter defaultCenter] removeObserver:self];
+0

완벽하게 일했으며 매우 똑바르다. 감사! – TheTC

+0

해피 그걸 해피 그리고 당신은 환영합니다 :) – antf

3

내 의견에 대해 자세히 설명합니다. 이것은 레이블을 업데이트하는 위임 메서드를 구현하는 방법입니다. 부모 뷰 컨트롤러의 헤더에서

:

#import "ModalViewController.h" 

@interface ViewController : UIViewController <ModalViewControllerDelegate> 

/* This presents the modal view controller */ 
- (IBAction)buttonModalPressed:(id)sender; 

@end 

그리고 구현은 :

여기
/* Modal view controller did save */ 
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text 
{ 
    NSLog(@"Update label: %@", text); 
} 

/* Prepare for segue */ 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"modalSegue"]) 
    { 
     ModalViewController *mvc = (ModalViewController *) segue.destinationViewController; 
     mvc.delegate = self; 
    } 
} 

/* Present modal view */ 
- (IBAction)buttonModalPressed:(id)sender 
{ 
    [self performSegueWithIdentifier:@"modalSegue" sender:self]; 
} 

당신은 상단의 위임 방법을 참조하십시오.

과 같이 위임 프로토콜 포함됩니다 모달 뷰 컨트롤러의 헤더 :

/* Save button was pressed */ 
- (IBAction)buttonSavePressed:(id)sender 
{ 
    if ([self.delegate respondsToSelector:@selector(modalViewControllerDidSave:withText:)]) 
     [self.delegate modalViewControllerDidSave:self withText:@"Some text"]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

경우 :

@protocol ModalViewControllerDelegate; 

@interface ModalViewController : UIViewController 

@property (nonatomic, weak) id <ModalViewControllerDelegate> delegate; 

- (IBAction)buttonSavePressed:(id)sender; 

@end 

@protocol ModalViewControllerDelegate <NSObject> 
- (void)modalViewControllerDidSave:(ModalViewController *)viewController withText:(NSString *)text; 
@end 

모달 뷰 컨트롤러의 구현은, 이것과 같은 방법을 포함하는 것을 저장 버튼을 누르면 대리인에게 통보되고 텍스트보기의 텍스트는 위임 메소드를 통해 전송됩니다.

+0

이것은 매우 견고합니다. 고맙습니다. 이것에 대해 지금 시험해보십시오. 감사합니다. – TheTC

+0

. 위임 속성을 항상 약한 참조로 만드는 등의 강력한 제안이있는 자세한 설명은 [이 답변] (http://stackoverflow.com/a/6169104/426839)을 참조하십시오. –

+0

사실, 대의원은 분명히 약할 것입니다. 그건 실수 였어. 답변을 업데이트했습니다. 감사. – simonbs

1

을 추가하여 기본보기에 사용되는 그 NSNotificationCenter을 resomve하는 것을 잊지 마십시오 :

ParentViewController : 오더 뷰에서

func updateLabel() { 
     yourLabel.text! = "what you need" 
    } 

override func viewDidLoad() { 
     super.viewDidLoad() 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.updateLabel), name: "DoUpdateLabel", object: nil) 
} 

:

@IBAction func closePopUp(sender: AnyObject) { 

     NSNotificationCenter.defaultCenter().postNotificationName("DoUpdateLabel", object: nil, userInfo: nil) 
    }