UIViewController의 뷰 내에 중첩 된 뷰 컨트롤러의 뷰를 갖는 것이 일반적으로 iOS에서 나쁜 프로그래밍 관행입니까? 예를 들어 사용자의 터치에 반응하지만 화면의 25 % 만 차지하는 일종의 인터랙티브 요소를 갖고 싶었습니다.
이 중첩 된 뷰 컨트롤러를 UIViewController에 다음과 같이 추가한다고 가정합니다.
[self.view addSubview: nestedViewController.view];
UIViewController의 뷰 내에 중첩 된 뷰 컨트롤러의 뷰를 갖는 것이 일반적으로 iOS에서 나쁜 프로그래밍 관행입니까? 예를 들어 사용자의 터치에 반응하지만 화면의 25 % 만 차지하는 일종의 인터랙티브 요소를 갖고 싶었습니다.
이 중첩 된 뷰 컨트롤러를 UIViewController에 다음과 같이 추가한다고 가정합니다.
[self.view addSubview: nestedViewController.view];
답변:
아니요, 이것은 일반적으로 좋은 디자인이며 뷰 컨트롤러를 간결하게 유지하는 데 도움이됩니다. 그러나 뷰 컨트롤러 포함 패턴을 사용해야합니다. 다음 문서를 참조하십시오.
이것은 Storyboard와 함께 Interface Builder를 사용하여 설정하는 것이 매우 간단합니다. 개체 라이브러리의 Container View를 살펴보십시오.
다음은 스토리 보드의 인위적인 예입니다. 이 예에서는 3 개의 컨테이너를 보유하고 각 컨테이너에 대해 하나씩 4 개의 뷰 컨트롤러가 있습니다. 모든 컨테이너가 포함 된 가장 왼쪽 컨트롤러를 제시하면 Storyboard가 자동으로 초기화되고 다른 3을 포함합니다. childViewControllers
속성을 통해 이러한 자식보기 컨트롤러에 액세스 할 수 있습니다. 또는 prepareForSegue:sender:
대상보기 컨트롤러를 재정의 하고 캡처 할 수있는 메서드가 있습니다. 호출 될 segue. 필요한 경우 자식 뷰 컨트롤러에 속성을 전달하는 것도 좋은 점입니다.
이 코드를 부모 뷰 컨트롤러에 넣었습니다. 그것은 나를 위해 잘 작동합니다.
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).
다음은 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)