2011-05-02 3 views
17

UISplitViewController를 기반으로하는 iPad 앱을 만들고 있습니다. 내 응용 프로그램 potrait에서 시작하면 toobar 버튼에 약간의 문제가 있습니다. 팝업을 표시하는 버튼이 표시되지 않습니다. 그러나 iPad를 가로로 회전 한 다음 다시 세로로 가져 가면 단추가 나타납니다!UISplitViewController가 세로를 시작할 때 팝업 버튼을 표시하지 않음

그것은 (이것이 내가 버튼을 표시하는 코드 한 명이있다) 출시에 호출되지 않습니다 다음과 같은 방법처럼 보인다하십시오 앱 출시하지만이있는 경우에만 경우

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc 

가이 메소드가 호출되지 않습니다 회전. 낯선 사람은 Xcode UISplitViewController 템플릿 + 핵심 데이터 (이 앱을 만들 때 사용한 템플릿과 비슷합니다)를 사용하여 테스트 앱을 만들었습니다. 한 줄의 코드를 작성하지 않은 테스트 응용 프로그램에서 세로 모드로 내 앱을 실행하면 단추가 표시되고 다른 앱과는 달리 위의 메서드가 실행될 때도 호출됩니다. 비슷한 문제가있는 사람이 있습니까? http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

+0

중복 될 수있는이 질문에 내 대답을 참조하십시오 http://stackoverflow.com/questions/9411571/uisplitviewcontroller-willhideviewcontroller-willshowviewcontroller-not-called-a/12923909#12923909 – avance

답변

23

"키시 티즈"는 올바른 개념을 가지고 있습니다. 먼저 viewDidLoad 메서드에서 self.splitviewController.delegate = self를 설정했습니다.이 위임을 설정하는 데 약간 늦었습니다. 그래서 awakeFromNib 메서드 인 위임을 초기 단계에서 설정하려고했습니다. 그렇다면 잘 작동합니다.

viewDidLoad에서보기가 이미로드 된 후 문제가 발생하면 위임이 작동하지 않고 일부 활동 (예 : iPad 회전) 후 얼마 지나지 않아 작동합니다. 따라서 viewDidLoad보다 초기 단계는 awakeFromNib입니다.

- (void) awakeFromNib{ 
    [super awakeFromNib]; 
    self.splitViewController.delegate = self; 
} 
+1

마침내! 언제나 그렇듯이, 일단 당신이 그것을 안다면 그것은 아주 명백합니다. –

1

당신이 splitviewcontroller 대리자를 설정 한 :

마지막으로,이 UISplitViewController가 처음 표시 될 때이 메서드를 호출하도록되어 여부 사과 문서는 매우 명확하지 않다? 일반적으로 대리인이 설정되지 않은 경우 문제가 발생합니다.

+0

예 내가 가지고 있지만, IB에서만. 후속 방향 변경에서 호출되므로 적절하게 설정됩니다. IB에서 설정 되었기 때문에보기가 처음 나타날 때 설정할 수 없으며 잠시 후에 올바르게 설정할 수 있다고 생각하십니까? 이 소리가 미친 거의 불가능한 내게는 – rpechayr

+0

언제든지 split view 컨트롤러의 델리게이트를 설정할 수 있습니다. 그리고 당신은 delegate를 다음 뷰 컨트롤러로 변경할 수 있습니다. 분할 뷰의 델리게이트로 변경했습니다. 이것이 도움이 될 것이라는 희망을 확인하십시오. ..http : //kshitizghimire.com.np/uisplitviewcontroller-push-viewcontroller-in-master-and-detail/ 및 http://kshitizghimire.com.np/uisplitviewcontroller-multipledetailviews-with-navigation-controller/ –

+0

생각합니다. xib에서로드 할 때 충분히 빠르게 설정되지 않습니다. –

0

동일한 문제가 있습니다. 내 견해가 IB에 설정되어 있으며 타이밍상의 문제인 것처럼 보입니다. 분할 뷰가 초기 방향 "변경"에 대해 통보 한 후에 분할 뷰 대리자가 설정됩니다. 응용 프로그램 대리인의 콘센트에 분할보기를 추가하면 세로 시작시 버튼이 나타나지만 팝업을 열면 비어 있습니다. 이것은 아마도 어떻게 든 돌아 다닐 수 있지만, 분할 뷰가 설정되었을 때 현재 방향에 대해 대리자에게 알리지 않는다는 것이 이상하다고 생각합니다.

0

나는 똑같은 문제가 있었고, Martin Gunnarsson의 대답은 저를 해결책으로 이끌었습니다.

위임자 뷰 (상세 뷰)가 이미로드 된 후 UISplitViewController의 대리자 속성을 설정하기 전에 viewDidLoad:에 설정했습니다. 이 때까지는 UISplitViewController가 이미 초기 메시지 인 splitViewController:willHideViewController:withBarButtonItem:forPopoverController:을 보냈습니다. 나는 단지 대표자를 조만간 설정하지 않았다.

해결책은 주 앱 대리인의 대표자를 application:DidFinishLaunchingWithOptions:에 할당하는 것이 었습니다. 이 경우 내 대리자는 내비게이션 컨트롤러에 포함되어 있으므로 한 층 더 깊이 파고 가져와야했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1]; 
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController; 
    return YES; 
} 
0

이 내가 아웃 - 오브 - 박스 splitViewController과 첫 번째와 두 아이 패드 프로젝트에서 일하고 있어요 때문에 나를 이렇게 더뿐만 아니라 예비 운전 : 여기

작동 코드입니다 항상 '마스터'버튼을 보여 주지만 두 번째 버튼은 결코하지 않았습니다. 내가 눈을 뗄 때까지 콘센트와 관계 및 대리인을 비교했지만 결국 appDelegate에서 대답을 발견했습니다. 그것은 didFinishLaunchingWithOptions :, 특히 splitViewController.delegate가 설정된 곳에서 응용 프로그램에서 너무 많이 주석 처리했습니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 
    } 

AppDelegate에이를 추가하면 splitViewController를 서브 클래스 않아도됩니다. 또한 IB에서 대리인 연결을 시도했지만 어떤 이유로 그 중 하나도 가지지 않습니다. 스토리 보드 디자인 결함, imho.

0

꽤 오래 동안 붙어있었습니다. 마침내 그것이 작동하게했다. awakeFromNib가 작동하지 않았습니다. didFinishLaunchingWithOptions가 그랬습니다. Popover 컨트롤러의 항목을 채우는 쿼리를 실행하고있을 수 있습니다.

관련 문제