iOS Nested View Controllers는 UIViewController의 뷰 내부에서 볼 수 있습니까?


90

UIViewController의 뷰 내에 중첩 된 뷰 컨트롤러의 뷰를 갖는 것이 일반적으로 iOS에서 나쁜 프로그래밍 관행입니까? 예를 들어 사용자의 터치에 반응하지만 화면의 25 % 만 차지하는 일종의 인터랙티브 요소를 갖고 싶었습니다.

이 중첩 된 뷰 컨트롤러를 UIViewController에 다음과 같이 추가한다고 가정합니다.

[self.view addSubview: nestedViewController.view];

6
여기에 많은 사진이있는 전체 튜토리얼이 있습니다 !! stackoverflow.com/a/23403979/294884 Enjoy
Fattie

답변:


148

아니요, 이것은 일반적으로 좋은 디자인이며 뷰 컨트롤러를 간결하게 유지하는 데 도움이됩니다. 그러나 뷰 컨트롤러 포함 패턴을 사용해야합니다. 다음 문서를 참조하십시오.

컨테이너보기 컨트롤러 구현

이것은 Storyboard와 함께 Interface Builder를 사용하여 설정하는 것이 매우 간단합니다. 개체 라이브러리의 Container View를 살펴보십시오.

다음은 스토리 보드의 인위적인 예입니다. 이 예에서는 3 개의 컨테이너를 보유하고 각 컨테이너에 대해 하나씩 4 개의 뷰 컨트롤러가 있습니다. 모든 컨테이너가 포함 된 가장 왼쪽 컨트롤러를 제시하면 Storyboard가 자동으로 초기화되고 다른 3을 포함합니다. childViewControllers속성을 통해 이러한 자식보기 컨트롤러에 액세스 할 수 있습니다. 또는 prepareForSegue:sender:대상보기 컨트롤러를 재정의 하고 캡처 할 수있는 메서드가 있습니다. 호출 될 segue. 필요한 경우 자식 뷰 컨트롤러에 속성을 전달하는 것도 좋은 점입니다.

여기에 이미지 설명 입력


42
어떻게 "도대체"를 스토리 보드에서 수행합니까?! 그것은 기본적인 질문입니다. .. 나는 답을 모릅니다. :) 한숨 – 내 질문에 답합니다. 장면에 컨테이너 를 추가합니다 . 그것을 형성하십시오. 그런 다음 스토리 보드의 빈 필드에 UIViewController를 만듭니다. 그런 다음 해당 컨테이너 (네비게이터 목록 또는 GUI)에서 새 UIViewController로 마우스 오른쪽 버튼을 클릭하여 드래그합니다. 팝업에서 viewDidLoad-embed를 선택하여 시작하십시오. 고마워 크리스! :)
Fattie

그런데 링크가 끊어졌습니다.
Benjohn

2
@JoeBlow +1 "viewDidLoad-embed"신성한 소 : 누가 그것을 짐작했을까요!
Drux

감사합니다 @ChrisWagner! 이것은 MVVM 아키텍처를 구현하고 Massive View Controller / "MVC"를 피하는 데 중요한 퍼즐 조각입니다.;)
Rob

54

이 코드를 부모 뷰 컨트롤러에 넣었습니다. 그것은 나를 위해 잘 작동합니다.

Obj C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

스위프트 :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

또 다른 옵션은 IB를 사용하고 컨테이너보기를 넣는 것입니다. UIViewController가 자동으로 표시됩니다 (이 경우 XCode 9). 여기에 이미지 설명 입력


2
예! +1. :)이 프로그래밍 방식으로 작업을 수행하는 방법에 대한 답변을 포함하여 주셔서 감사합니다
C. Tewalt을

자식 뷰 컨트롤러에서 부모 하위 뷰의 목록으로 뷰를 끌어다 놓았습니다.
dimpiax

5

다음은 FB의 답변에 대한 Swift Developers를 기반으로 한 Swift 3 솔루션입니다.

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.