문제

나는 근본적인 것을 놓친 것 같아서 커뮤니티에 도움을 요청하고 싶습니다. 기본 iPhone 유틸리티 응용 프로그램을 기반으로 앱을 구축하고 있습니다. MainView 및 FlipsideView는 일부 요소를 공유하므로 해당 작품에 대해 별도의 ViewControllers 및 NIB 파일을 만들었습니다. 이 작업을 수행하기 위해 다음을 수행했습니다. 1. SearchDateView.xib의 파일의 소유자 인 SearchDateViewController라는 ViewController를 만들었습니다. SearchDateView.xib는 기본적으로 uilabel이있는 UIView입니다. MainViewController.m 및 FlipsideViewController.m 둘 다 Folllows로 서브 뷰를 추가합니다.

- (void)loadView{
    [super loadView];
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil];
    [[searchDateViewController view] setFrame:[searchDateView frame]];
    [[self view] addSubview:[searchDateViewController view]];

...
}

모든 것이 표시되고 잘 작동합니다. 기본적으로 각 메인 및 플립 사이드 뷰에서 발생하는 동작에 따라 펜촉의 uilabel이 변경됩니다. 그러나 SearchDateViewController가 MainView 또는 FlipsideView에서로드되면 약간 다른 일을하고 싶었습니다. 그러나 어떤 ViewController가 SearchDateViewController 하위 뷰를 추가하는지 알아낼 수 없습니다.

SearchDateViewController에서 시도해 보았습니다.

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"superview %@", self.view.superview);
    NSLog(@"parentviewcontroller %@", self.parentViewController);
}

두 경우 모두 나는 nil을 얻는다.

그래서 내 질문은 - 어떤 ViewController가 SearchDateViewController AA 하위 뷰를 추가하는지 알아낼 수 있습니까? 그렇다면 어떻게? 또는 여기의 논리가 완전히 엉망이된다면 어떻게해야합니까?

감사!

도움이 되었습니까?

해결책

viewDidLoad View Controller가 뷰를로드했을 때 호출됩니다. 당신의 경우, 그것은이 라인에서 일어난다 :

[[searchDateViewController view] setFrame:[searchDateView frame]];

그 순간, 당신은 아직 전화하지 않았습니다 addSubview: 따라서 View의 수퍼 뷰가 NIL 인 것은 놀라운 일이 아닙니다.

문제를 해결하려면 SearchDateViewController 내부의 속성을 정의하여 다른 경우를 구별해야합니다. 그런 다음이 속성은 SearchDateViewController 인스턴스를 생성하는 상위 컨트롤러에 의해 그에 따라 설정됩니다.

일반적으로 전체 화면 뷰 자체로 사용되기보다는 하나 또는 여러 개의 전체 화면보기의 하위 뷰로 사용되는 뷰를 위해 UIViewController 서브 클래스를 컨트롤러로 사용하는 것이 좋지 않다고 생각합니다. UIViewController의 논리의 대부분은 전체 화면보기를 관리하는 데 사용된다는 가정에서 작동합니다. 예를 들어, 디자인을 사용하면 장치 방향이 변경 될 때 SearchDateViewController가보기의 프레임을 수정할 수 있다고 생각합니다. .

다른 팁

ViewController 및보기는 완전히 분리되어 있습니다.

대부분의 경우 부모보기에 하위 뷰를 추가하면 부모의 뷰 콘트롤러에 컨트롤러를 추가하지 않습니다. 이 규칙의 예외는 뷰 컨트롤러의 계층 구조를 유지하기 위해 뷰 대신 컨트롤러를 추가하는 탐색 컨트롤러입니다.

당신의 SearchDate ViewController는 할당하지 않았으며 시스템이 자동으로 수행하지 않기 때문에 상위 컨트롤러를 찾을 수 없습니다. 다른 컨트롤러에서보기를 불러 일으킬 때 부모 컨트롤러를 할당 할 수 있습니다.

searchDateViewController.parentController=self;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top