2011-03-24 7 views
1

이 작업을 수행하는 가장 좋은 방법은 확실하지 않아서 물어볼 것이라고 생각했습니다. 여기 중첩 된보기 컨트롤러가있는 iOS 사용자 지정 탐색

이 프로그램의 목적입니다 :

  • 에 의해 조작 실제로 다른 화면에 대한
  • 중첩 된 뷰 컨트롤러를 (쉽게 디자인을 조작하려면)은 UINavigationController을 하위 클래스로하지 않는 루트의 UIViewController로 작성된 사용자 정의 탐색 컨트롤러 (기본보기 컨트롤러)
  • 각 중첩 된 뷰 컨트롤러는

현재 자신의 nib 파일을 가지고, 나는 그것이 작동이 그러나 각각의 중첩 된 뷰 컨트롤러는 뷰 컨트롤러가 아니라 서브 클래 싱 된 UIView입니다. View Controller의 기능 (viewDidLoad)이 없어도 View Controller 방식으로 이러한 UIView를 사용하기 때문에 이것이 나쁜 습관 인 것 같습니다. 또한 이러한 UIView는 UIViewController의 일반적인 위임 메서드를 사용합니다 (실제로 빨간색 플래그를 설정 함).

실제로 이것은 나쁜 습관입니까?

NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil]; 

for (id object in bundle) { 
    if ([object isKindOfClass:[SubclassedUIView class]]) 
     currentScreenViewController = (SubclassedUIView *)object; 
} 

I 피난처 : 나는 UIViewControllers로 전환 할 때의 두려워

상황이 난 아직도 내가 통해 펜촉을로드 할 때를 가리 키도록 볼을 식별 할 수있는 UIView의 서브 클래스를 만들어야 할 것입니다 아직 체크하지 않았지만 번들에 다른 UIView 객체가 있기 때문에 "SubclassedUIView"가 아니라 해당 명령문에서 UIView를 수행해야한다고 가정합니다. 그러나 다시 한번, 그 상황은 현재 상황보다 나을 수 있습니다.

다른 해결책은 MainViewController를 대리자가 필요한 모든 UIView에 대한 대리자로 만들고 각 중첩 된 펜촉에 대한 대리자 메서드를 포함하는 MainViewController의 범주를 만드는 것입니다.

여기에 어떤 아이디어가 있습니까?

답변

0

은 분명히, 내가하고 있던 것은 How to add an UIViewController's view as subview에 따라 종류의 확인이었다.

+0

다른 게시물에서 솔루션 http://stackoverflow.com/questions/17499391/ios-nested-view-controllers-view-inside-uiviewcontrollers-view –

3

SubclassedUIView 유형에 대해 UIViewController 하위 클래스를 만들고 해당 인터페이스의 XIB 파일을 만드는 옵션을 선택하고 모든 코드를 위로 이동하여 self.view으로 지정합니다. 그런 다음 해당보기 컨트롤러에 대한 .xib로 Interface Builder를 열고 UIView의 시각적 모양을 원하는만큼 구성하십시오. 메인 뷰 컨트롤러에서 시각적 요소를 조작하려면 각 요소에 "태그"번호를 할당하거나 IBOutlet 인스턴스 변수를 모두 만들어 IB의 요소에 연결해야합니다. 방법 당신이 적절하게 사용하여 현재 뷰 컨트롤러 UINavigationController은 다음과 같습니다

/* at the top of your main view controller */ 
#import "SubclassedUIViewController.h" 

/* when navigating to the next view */ 
SubclassedUIViewController *newController = [[SubclassedUIViewController alloc] initWithNibName:@"SubclassedUIViewController" bundle:nil]; 
[(UILabel *)[newController.view viewWithTag:6] setText:@"Text"]; // example of accessing elements using tags 
[newController.textLabel setText:@"Text 2"]; // example of accessing elements using IBOutlet connections 
[self.navigationController pushViewController:newController animated:YES]; 
[newController release]; 

인터페이스 빌더는 또한 당신의 메인 뷰 컨트롤러 .xib 파일에 네비게이션 컨트롤러를 추가 등 뒤로 버튼 텍스트, 메인 타이틀을 제공 할 수 있습니다 서브 클래 싱 된 뷰 컨트롤러를 구현하고 initWithNibName:bundle:을 재정의하고 self.navigationItem.title 및 기타 속성 인 self.navigationItem을 설정합니다.

EDIT : 서브 클래 싱 된 뷰의 특정 속성을 조작 할 수 있어야한다는 것을 의미합니까? 에서와 마찬가지로 항상 모든 사용자에게 액세스해야합니까?이 경우 다음 주 뷰 컨트롤러를로드 할 때 당신의 서브 클래스 뷰에 연결을 할 경우, 즉 : 당신의 서브 클래스 컨트롤러에

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.subclassedController1 = [[SubclassedUIViewController1 alloc] initWithNibName:@"SubclassedUIViewController1" bundle:nil]; 
    // self.subclassedController2 = ... etc 
} 

/* in your loading next view code you can skip the alloc/init line */ 
[self.navigationController presentViewController:subclassedController2 animated:YES]; 

그리고 당신은 몇 가지 방법으로 메인 컨트롤러로 얻을 수 있습니다 :

  1. [(MyCustomAppDelegateClass *)[[NSApplication sharedApplication] delegate] rootView] 또는 이와 유사한 (기본적으로 참조 응용 프로그램 대리인이 응용 프로그램의 기본보기에 보유)에 self.parentViewController
  2. 호출에 대한 호출.
  3. 메인보기 컨트롤러를 가리키는 서브 클래 싱 된 컨트롤러에 @property (assign) 속성과 ivar를 추가합니다. 메인보기 컨트롤러를로드 할 때 subclassedController1.mainViewController = self과 함께 할당 할 수 있습니다.

도움 문서 :

  1. View Controller Programming Guide for iOS: Navigation Controllers
  2. Xcode Quick Start Guide (엑스 코드 4 업데이트)
+0

죄송합니다 - 제한적이기 때문에 UINavigationController를 하위 클래스로 만들고 싶지 않습니다. 그 질문이 명확하게 반영되었음을 반영하기 위해 약간의 질문을 편집했습니다. – AndrewKS

+0

위에서 쓴 모든 것은 정상적이고 서브 클래 싱되지 않은'UINavigationController'에 의해 처리 될 수 있습니다. 제가 이야기하는 하위 클래스는 기본 탐색 컨트롤러로 푸시하고 팝하는 항목입니다. 루트 뷰 컨트롤러조차도 서브 클래 싱 된 'UIViewController'입니다. 내비게이션 컨트롤러 자체는 실제로 루트보기 컨트롤러의 기본보기의 하위보기로 기본 창의 인터페이스 작성기 인터페이스에서 정의됩니다. – darvids0n

+0

같은 일을하고 싶지만 UINavigationController가 다음 컨트롤러 전환 방법을 지정할 수 없기 때문에 이동하지 않는 것으로 가정합니다. 예를 들어, 왼쪽/오른쪽에서 애니메이션을 푸시/팝으로 제어하지만,이를 제어하는 ​​것이 좋습니다. 작동하는 프로토 타입을 만들었지 만 프로토 타입 프로젝트가 더 이상 작동하지 않기 때문에 코드베이스에 통합되었을 때 멀티 스레딩에 문제가 있다고 생각합니다. UIViewController 어떻게 든 할 수없는 UINavigationController 계속 정교한 뭔가 의심. 나는 모른다. – horseshoe7

관련 문제