2010-05-03 2 views
43

일반적으로 IB 프로젝트없이 프로젝트를 만듭니다. 내가 할 첫 번째 일은 xibs, 콘센트 업데이트 plist 등 모든 참조를 제거하는 것입니다. 아무런 문제가 없으며, 내 세계에서 위대한 작품!프로그래밍 방식으로 nib/xib가없는 UISplitViewController

이제 3.2 버전을 설치하고 첫 번째 iPad 앱을 개발하려고했습니다. 이전과 같은 절차에 따라 UISplitView 기반 응용 프로그램 프로젝트를 만들고 모든 IB 항목을 제거했습니다. 또한 Apple의 참조 문서 : Creating a Split View Controller Programmatically의 섹션을 따라 갔지만 그럼에도 불구하고 마스터 뷰는 표시되지 않으며 디테일 뷰만이 (방향이 무엇이든) 표시됩니다. 나는 이것을 조심스럽게 보려고 노력했지만, 내가 놓친 것을 이해할 수는 없다.

어딘가에 떠있는 닙이없는 UISplitViewController의 작동 예가 있습니까? 나는 봤지만 아무 것도 못 찾았 어. 아니면 내가 놓친 게 뭔지 알아?

+8

"보통 IB 프로젝트없이 프로젝트를 만듭니다." <- +1. 그것이 프로그래밍의 작동 방식입니다. 너 락! –

답변

55

, 당신의 대리인 헤더에 splitviewcontroller를 선언

당신이 detailedViewController 헤더 파일에 UISplitViewControllerDelegate을 추가하고 aswell 위임 방법이 있는지 확인하여 didfinishlaunching이 같은 것을 사용합니다. 관련 헤더 파일

을 가져 기억
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  

    splitViewController = [[UISplitViewController alloc] init]; 

    rootViewController *root = [[rootViewController alloc] init]; 
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root]; 

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail]; 

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil]; 
    splitViewController.delegate = detail; 

    [window addSubview:splitViewController.view]; 

편집 - 아래 스콧의 우수한 제안에 따라, IB ;-)

대신

[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    [window makeKeyAndVisible]; 
    return YES; 
} 


//detailedView delegate methods 
- (void)splitViewController:(UISplitViewController*)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem*)barButtonItem 
     forPopoverController:(UIPopoverController*)pc 
{ 
    [barButtonItem setTitle:@"your title"]; 



    self.navigationItem.leftBarButtonItem = barButtonItem; 
} 


- (void)splitViewController:(UISplitViewController*)svc 
    willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.navigationItem.leftBarButtonItem = nil; 
} 

나는 또한 선호, 윈도우 서브 뷰에 코드를 추가하지 않습니다

+5

이 답변은 제가 찾고있는 것입니다. 한 가지 질문 : Apple의 참조 예제 코드 (http://developer.apple.com/library/ios/ipad/#samplecode/MultipleDetailViews/Listings/Classes_RootViewController_m.html)에서는 루트보기 컨트롤러에서 UiSplitviewcontroller 대리자를 처리합니다. 대신 세부 컨트롤러에서 처리합니다. 편도 또는 다른 이유가 있을까요? –

+0

대리인이되는 컨트롤러는 귀하에게 달려 있습니다. 'detailViewController'가 완전하게 괜찮은'rootViewController'를 * 명령 *한다고 생각한다면 :). 이 경우 변수 이름을 디자인에 맞는 이름으로 변경하고 싶을 수도 있지만 (예 :'rootViewController' 및'detailedViewController'에 대한'listViewController' 및'mainViewController') – nacho4d

22

오래된 스레드지만, 위의 기술이 장치 방향 변경 이벤트에 올바르게 응답하는 UISplitViewController를 생성하지 못하면 독자 시간 + 슬픔을 덜어 줄 것이라고 생각했습니다.

  1. 모든 하위 뷰 shouldAutorotateToInterfaceOrientation에 제대로 응답 확인 : 당신은해야합니다. 여기에 새로운 것은 없습니다. 하위 뷰를 같이 splitviewcontroller의보기를 추가

    [self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    

: 메인 창에 UISplitViewController의보기를 추가하는 대신

  • [window addSubview:splitViewController.view]; // don't do this 
    

    대신 UISplitViewController에 메인 윈도우의 루트 컨트롤러를 설정 메인 윈도우 (간신히)는 형제 뷰와 함께 존재할 수 있지만 UISplitViewController의 의도 된 유스 케이스에서는 작동하지 않습니다. UISplitViewController는 하이랜더 뷰입니다. 일 수 있습니다.

  • 3

    방금 ​​같은 문제가 발생했습니다. splitview의 하위 viewController가 인터페이스 방향으로 자동 회전 할 수 있는지 확인하십시오.

    이처럼 childViewController의 기능을 변경할 수 있습니다

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
        return YES; 
    } 
    

    는 마스터 뷰가 표시됩니다.

    +1

    당신을 사랑합니다! 내 문제가 해결되었습니다! – mineschan

    관련 문제