2010-03-09 5 views
2

이 질문은 여러 번 요청되었으며이 주제에 대한 기존 게시물을 읽었지만 여전히 도움이 필요하다는 것을 알고 있습니다.UIViewController parentViewController 액세스 속성

나는 부모와 자식이 2 UIViewControllers입니다. 나는 아래와 같은 presentModalViewController를 사용하여 아이 UIViewController을 표시 :

ChildController *child = 
[[ChildController alloc] initWithNibName:@"ChildView" bundle:nil]; 
[self presentModalViewController:child animated:YES]; 
[child release]; 

자식 뷰가 UIPickerView 있습니다. 사용자가 UIPickerView에서 항목을 선택하고 완료되면 모달보기를 닫고 부모보기의 UITextField에 선택한 항목을 표시해야합니다.

자녀의 버튼에서 나는 다음을 수행 delegate하십시오

ParentController *parent = 
(ParentController *)[self.navigationController parentViewController]; 
[parent.myTextField setText:selectedText]; 
[self dismissModalViewControllerAnimated:YES]; 

모든 오류없이 작동합니다. 하지만 업데이트 된 UITextField이 표시되도록 부모보기를로드하는 방법을 모르겠습니다.

나는
[parent reloadInputViews]; 

는 '작업 아무튼했습니다. 도와주세요.

답변

13

위임은 이동 방법입니다. 나는 더 쉬운 해결책을 찾고 있을지도 모르는 사람들을 알고 있지만 나는 다른 사람들을 시험해 보았고 위임보다 나은 것은 아무것도 없었다. 동일한 문제가있는 사람이라면 위임을 읽고 단계별로 따라 가십시오.

subviewcontroller.h에서 - 프로토콜을 선언하고 그 안에 대리자 mthod를 선언하십시오. @ 인터페이스 내에서 subviewcontroller.h에서

@protocol myDelegate 
-(void)clickedButton:(subviewcontroller *)subController; 
@end 

: 당신의 subviewcontroller.m에서

id<myDelegate> delegate; 
@property (nonatomic, assign) id<myDelegate> delegate;  
NSString *data; 
-(NSString *)getData; 

는 myDelegate을 합성. 당신은 서브 뷰가 그것을 어떻게해야 무엇이든 일을 이루어집니다 당신의 parentviewcontroller에 통보 할 위치에 다음 코드를 추가합니다 : 당신이 당신의 parentviewcontroller로 보낼 원하는 데이터를 반환 할 수있는 GetData

[delegate clickedButton:self]; 

을 다음 처리를

당신의 parentviewcontroller.h, 수입 subviewcontroller.h에서

및 사용은 parentviewcontroller에서

#import "subviewcontroller.h" 
@interface parentviewcontroller : VUIViewController <myDelegate> 
{} 

을 위임합니다.대리자 메서드 구현

- (void)clickedButton:(subviewcontroller *)subcontroller 
{ 
    NSString *myData = [subcontroller getData]; 
    [self dimissModalViewControllerAnimated:YES]; 
    [self reloadInputViews]; 
} 

메모리 관리를 잊지 마라!

+0

+1 좋은 답변입니다. 너는 내 머리를 구할거야. 무리 감사. –

+0

그게 전부 서사시 답 이네. 감사!. :-) – CalZone

0

모달 뷰 표시 중에 메모리 부족 경고가 표시되면 상위 뷰가 언로드됩니다. 그런 다음 parent.myTextField은보기가 다시로드 될 때까지 올바른 텍스트 필드를 더 이상 참조하지 않습니다. parent.view;

그러나 부모보기에 자식 뷰에서 설정할 수있는 String 속성이있는 것이 더 좋은 방법 일 수 있습니다. 그런 다음 상위 뷰가 다시 나타나면 해당 데이터를 텍스트 필드 (예 : viewWillAppear:)에 넣습니다. 상위 뷰가 초기에 표시 될 때 값을 일부 기본값으로 설정하려고합니다.

+0

viewWill 하위 모달을 해제 할 때 Appear가 실행되지 않습니다. '완료'버튼은 자식 뷰 내부에 있으며 피커 뷰의 선택된 텍스트를 가져온 다음 모달을 닫습니다. 부모는 바로 거기에 나타나서 다시 나타나지 않아도됩니다. 나는 왜 그것이 viewWillAppear을 발생시키지 않는지 추측하고있다. – Dave

+0

프레임 워크를 사용하는 모든 방법을 올바르게 사용하고 있다면 viewWillAppear을 호출해야합니다. 올바른 클래스의 올바른 메소드를 재정의하고 있습니까? –

0

- (void) viewWillAppear : (BOOL) animated는 모달 뷰 컨트롤러 일 때도 나를 위해 호출되지 않습니다. 이유는 모르겠다. 이 응용 프로그램에서 아무데도 잘못 재정의되지 않으며 동일한 문제가 내가 작업하고있는 다른 2 개의 응용 프로그램에서도 발생합니다. 나는 그것이 효과가 있다고 생각하지 않는다.

이전에 위임 접근 방식을 사용했지만 다음과 같은 접근 방식도 꽤 좋다고 생각합니다.

은 그래서 같이있는 UIViewController에게 개인 카테고리를 추가하여이 문제를 해결 :

.H 파일 :

@interface UIViewController(Extras) 
// returns true if this view was presented via presentModalViewController:animated:, false otherwise. 
@property(readonly) BOOL isModal; 
// Just like the regular dismissModalViewController, but actually calls viewWillAppear: on the parent, which hasn't been working for me, ever, for modal dialogs. 
- (void)dismissModal: (BOOL) animated; 
@end 

와하는 .m 파일 :

@implementation UIView(Extras) 
-(BOOL) isModal 
{ 
    return self == self.parentViewController.modalViewController; 
} 

- (void)dismissModal: (BOOL) animated 
{ 
    [self.parentViewController viewWillAppear: animated]; 
    [self dismissModalViewControllerAnimated: animated]; 
} 
@end 

있는 내가 지금 할 수있는 대화 상자를 닫으려는 경우 다음과 같이 호출하십시오.

// If presented as a modal view, dismiss yourself. 
if(self.isModal) 
    [self dismissModal: YES]; 

이제 viewWillAppear가 올바르게 호출됩니다.

예, 보너스 'isModal'속성을 기증하여 모달보기에서 제시되는 방식을 알 수 있으며 적절히 자체 해제 할 수 있습니다.