2011-07-29 5 views
0

그래서 내가 응용 프로그램을 짓고 있어요 나는 서로에 대해 알 필요가 없습니다 몇 ViewControllers를 통해 실행하고이 구현을 사용 UINaviagtionController에 액세스하는 방법을 이해 이해, 그래서 그렇게 같은 뷰를 통해 전환 시작 도와주세요. ..

// remove the previous view in order to load in the new view 
    NSArray *sViews = [self.view subviews]; 
    [sViews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

    // create the new view, in this case the user wishes to 
    BaseViewController *baseVC = [[BaseViewController alloc] initWithNibName:@"BaseViewController" bundle:[NSBundle mainBundle]]; 
    self.baseViewController = baseVC; 
    [baseVC release]; 

    // add the newly created view to the screen 
    [self.view insertSubview:baseViewController.view atIndex:0]; 

은 상기 I가 상주하는 내비게이션 제어기 원하는 뷰 컨트롤러이다. I는 멤버 변수로서 UINavigationController가 생성하고 navController로 이름이 뷰 컨트롤러하는 .m 이내에. 그런 다음 아래 코드를 사용하여 UINavigationController를 구현하려고했습니다.

UIViewController *control = [[BusinessDisplayViewController alloc] initWithNibName:@"BusinessDisplayViewController" bundle: nil]; 
    navController = [[UINavigationController alloc] initWithRootViewController:control]; 
    [self presentModalViewController:navController animated:YES]; 

내가 겪고있는 문제는 두 가지입니다. 첫째, BusinessDisplayViewController (아래)가로드 될 때 내 맵 뷰와 tableView 사이에 20 픽셀 정도의 틈이 있는데 그 이유는 그 이유가 확실하지 않은 insertSubview:을 사용하여로드 할 때 존재하지 않습니다. 둘째, 일단 BusinessDisplayViewController.m에 있으면 BaseController에서 만든 navigationController에 액세스하는 방법을 모르겠습니다. 누군가가 왜 내 견해에 영향을 주는지, 어떻게 navigationController에 액세스 할 수 있는지, 또는 내가 올바른 방향으로 가고 있는지 설명 할 수 있습니까?

답변

1

UINavigationController는 아이폰에 3 가지 가능한 상황에서 사용하도록 설계되었습니다 : 응용 프로그램의 루트 뷰 컨트롤러로

  1. , 해당 뷰는 응용 프로그램의 윈도우의 하위 뷰로 추가로. UITabBarController의 viewControllers 중 하나로서
  2. .
  3. presentModalViewController:animated: 통해 전체 화면보기 컨트롤러로 제시했다.

귀하의 경우 UINavigationController은 자체적으로 창 서브보기로 표시되도록 구성되었습니다. 이것이 상단의 20 픽셀 간격을 보는 이유입니다. 창 개체가 상태 표시 줄의 아래에 있기 때문에 UINavigationController은 탐색 표시 줄의 위치를 ​​20 픽셀 (또는 통화 중일 경우 더 많이) 오프셋합니다.

루트보기 컨트롤러로 UINavigationController을 사용하는 표준 방법은 응용 프로그램 대리인의 속성으로 application:didFinishLaunchingWithOptions:에 생성하고 해당보기를 윈도우의 하위보기로 추가하는 것입니다. 그런 다음 모든보기 컨트롤러 내에서 네비게이션 스택을 누르면 self.navigationController을 사용하여 네비게이션 컨트롤러 개체에 액세스 할 수 있습니다.

+0

기본적으로 나는 내 사고 방식을 고치고 네비게이션 컨트롤을 앱의 루트에 추가하는 대신에 귀여운 것을 얻으려고한다. :) 또한 갭이 상단에 없다. 내보기의 그것은 실제로는 mapView와 tableView 사이에 있습니다. –

+0

글쎄, 나는 그것이 "귀엽다"라는 말에 달려 있다고 생각한다. Apple이 "전체 화면"보기를 관리하는 데 사용되는 UIViewController 프레임 워크를 설계했음을 명심하십시오. 화면의 일부만 차지하는 내비게이션 컨트롤러를 만들려한다면 iOS 4에서는 작동하지 않을 것입니다. 그러나 내비게이션 컨트롤러가 풀 스크린이고 원하는 위치에 있지 않을 경우 당신이 항상 presentModalViewController : animated :'를 사용하여 표현할 수 있습니다. – cduhn

1

보통, 당신은 당신의 응용 프로그램 설정이 방법을 가진 특별한 이유가 있나요, 당신은 UINavigationController 루트 레벨에 싶어? 그래도 질문에 대답하려면 property을 입력하고 점 표기법을 사용하여 변수에 액세스하십시오 : baseVC.navController.

20 픽셀 공간 문제를 들어, BaseViewController보기 관련 코드를 게시 할 수 있습니다. 아마도 프레임 경계와의 경계 일 것입니다.

+0

루트 레벨에서 설정되지 않은 큰 이유는 아닙니다. 주로 키 체인 확인 및 로그인/로그인 화면이있어 탐색 컨트롤러를 사용할 필요가 없다는 느낌이 들었습니다. 서로에게 정보를 전달하지 않아도되고, 다시 돌아갈 필요가 없습니다. 그러나 mapView 및 tableView를로드 할 때 비즈니스 및 사용자가 detailDisclosureButton을 클릭하면 비즈니스의 더 자세한 페이지가 표시되고 navController를 통해지도 및 비즈니스 목록으로 돌아갈 수 있습니다. –

+0

그리고 BaseViewController에서 내비게이션 컨트롤러를 만들었습니다. { IBOutlet UINavigationController * navController; } (at) 속성 (비 원자형, 유지) UINavigationController * navController; 또한 .m으로 합성했습니다. BaseViewController.m에서 쉽게 액세스 할 수 있지만, BusinessDisplayViewController.m에있을 때 나는 이렇게 새로운 변수를 만들 수 있습니까? BaseViewController * baseVC = [BaseViewController alloc]; \t baseVC.navController.navigationBar.barStyle = UIBarStyleBlackTranslucent; 그 때문에 나를 추락했습니다. –

+1

처음부터 탐색 컨트롤러를 사용하십시오. 너브 막대를 표시하지 않고 도구 막대를 표시하지 않도록 설정 한 다음 푸시 할 때 애니메이션을 수행하지 않아도 본질적으로 동일한 효과가 있습니다. 나는 그것이 당신의 20px 문제도 역시 해결할 것이라고 생각한다. – coneybeare