2011-01-19 3 views
6

내 iPad 응용 프로그램에서 모달보기 컨트롤러로 표시하는 UISplitViewController를 표시하려고합니다. 나는 그것을 표시 할 수 있지만 어떤 이유 때문에 모달 뷰의 왼쪽에 간격이 있으며 상태 바가 크기가 바뀌면 그대로 유지됩니다. 이런 일이 왜UISplitViewController를 모달 뷰 컨트롤러로 사용하는 방법은 무엇입니까?

alt text

는 사람은 알고 있나요? 아니면 이것이 가능하다면? 어쩌면 나는 거대한 구멍을 파고있다.

답변

6

재고 UISplitViewController은 루트보기 컨트롤러로만 사용하도록 설계되었습니다. 하나를 모달로 제시하면 Apple Human Interface Guidelines에 위배되며 App Review Team에 의해 거부 될 확률이 높습니다. 또한, 오류가 나타날 수 있습니다

Application tried to present Split View Controllers modally

+2

대안 엑스 코드 8에서 작동하지 –

+1

upvoted "애프터 마켓 뷰 컨트롤러"에 대한로, 크기에 애프터 마켓 splitview 컨트롤러를 시도하는 것입니다, 아이폰 OS 8 + 오류 로그가 있습니다 : "한 번에 하나의보기 컨트롤러에만보기를 연결할 수 있습니다!" –

3

기술적를,이 내가 무슨 짓을 :

1/서브 클래스의 UIViewController 즉. @interface aVC : UIViewController

2/viewDidLoad에서 splitViewController를 설정합니다. aSplitVC

3 그런 다음 self.view = aSplitVC.view 결국

, modalViewController

나는이 약간 떨어져 컬러 애플이다 에반 동의
+0

같은 https://github.com/SlavaBushtruk/APSplitViewController – Jerome

3

로 존재 AVC,하지만 난 완료 할 수 있었다/다음과 같은 솔루션이의 작업 버전 :

UISplitViewController *splitVC = [[UISplitViewController alloc] init]; 
    splitVC.delegate = VC2; 
    splitVC.viewControllers = [NSArray arrayWithObjects:navcon1, navcon2, nil]; 

    UINavigationController *splitNavCon = [[UINavigationController alloc] init]; 
    splitNavCon.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [splitNavCon.view addSubview:splitVC.view]; 
    VC2.splitParentViewController = splitNavCon; 

    [self presentViewController:splitNavCon animated:YES completion:nil]; 

이 나 화면에 모달 발표 된 새로운 UISplitViewController에서 다시 작업 버튼이있었습니다.

내가 실제로 VC2 (UISplitViewController의 대리자) 인 부모 UINavigationController를 전달한다는 것을 알 수 있습니다. 이것은 내가 내가 VC2 내에서 UISplitViewController을 기각 할 수있는 최선의 방법이었다

[splitParentViewController dismissViewControllerAnimated:YES completion:nil]; 
+1

기본 아이디어는 충분하지만 ARC는 다른 것이 없다면 ARC가'UISplitViewController'를 먹을 수도 있습니다. 따라서보기의 자식이 이런 방식으로 표시되면 사라지는 경우이를 속성이나 다른 것으로 옮기십시오. – Nuthatch

8

많은 분들을 위해, 나는 UISplitViewController를 사용하는 '모달 방식'을 필요로처럼. 이것은 오래된 문제인 것처럼 보이지만 StackOverflow에서 발견 한 모든 것은 왜 그렇게하려고 할 때 (위의 허용 된 대답과 같은) 또는 '해킹 - 주위'에서 문제가 발생하는지에 대한 설명이었습니다.

그러나 때로는 코드 기반을 많이 변경하여 UISplitViewController를 초기 개체로 설정하여 기능을 구현하고 실행하는 것이 편리하지 않은 경우가 있습니다.

밝혀진 바에 따르면, 모두를 행복하게 만드는 방법이 있습니다 (Apple 지침 포함). 내가 최고의 발견이 솔루션은 일반적으로 UISplitViewController을 사용했지만,/표시 기각 할 필요로 할 때, 다음과 같은 방법을 사용 :

"창"당신의 UISplitViewController 서브 클래스의 속성입니다
-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController 
    andDetailViewController: (UIViewController *) thisDetailViewController 
         completion:(void(^)(void))completion 
{ 
    masterViewController = thisMasterViewController; 
    detailViewController = thisDetailViewController; 

    [self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 

    self.window.rootViewController = self; 

    [self.window makeKeyAndVisible]; 

    if(completion) 
     completion(); 
    } 

-(void)dismissViewControllerWithCompletion:(void (^)(void))completion 
{ 
    self.window = nil; 
    masterViewController = nil; 
    detailViewController = nil; 
    if(completion) 
     completion(); 
} 

. 그리고 나머지는 시스템이 처리 할 것입니다!

ModalSplitViewController

--EXAMPLE 사용하는 방법에 -

mySplitViewController = [[ModalSplitViewController alloc] init]; 
    mySplitViewController.delegate = self; 

    [mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil]; 

    // when done: 

    [mySplitViewController dismissViewControllerWithCompletion:nil]; 
    mySplitViewController = nil; 

사이드 노트 :

편의/참고로, 나는 GitHub의에 UISplitViewController 서브 클래스로이 업로드 것 같아요 대부분의 혼동은 Apple 설명서의 UISplitView 사용 예에서 appDelegate 창 을 사용한다는 사실과 대부분의 사람들이 01이 아니라는 사실에 기인합니다은 창 개념에 익숙하므로 일반적으로 (StoryBoards 또는 상용구 코드에서 한 번 생성됨)이 필요하지 않기 때문에.

또한 상태 복원을 수행하는 경우 프로그래밍 방식으로 만든 UIViewController가 을 시스템에서 자동으로 복원하지 않는다는 사실을 잊어서는 안됩니다.

0

저는 다른 방법을 사용할 수 있다고 생각합니다 : 분할 컨트롤러를 표시하는 사용자 정의 컨트롤러 대신, 하나는 스토리 보드의 루트 창 컨트롤러로 분할 컨트롤러를 설정할 수 있으며,보기 상단에 사용자 정의 컨트롤러를 추가 할 수 있습니다 (즉 로그인 화면)을 열고 필요한 경우 화면에서 제거하십시오 (예 : removeFromSuperview).

0

그 대답은 iOS8 이후 더 이상 유효하지 않기 때문에 실제로 올바르지 않습니다. iOS7을 지원해야하는 경우 SplitView로 컨테이너가있는 실제로는 모달 UIViewController를 넣는 것처럼 할 수 있습니다.

let mdSplitView = self.storyboard?.instantiateViewControllerWithIdentifier("myDataSplitView") as! MyData_SplitVC 
    self.addChildViewController(mdSplitView) 

    mdSplitView.view.bounds = self.view.bounds 
    self.view.addSubview(mdSplitView.view) 
    mdSplitView.didMoveToParentViewController(self) 
관련 문제