2011-02-23 3 views
1

저는 작업중인 앱의 iPad 절반에 약간의 버그를 찾아 내려고 노력하고 있습니다. 그것은이 게시물에 문제에 관련이 :iPad UISplitView Detail 툴바가 시작시 NULL이됩니다.

iPad SplitViewController Strange Behaviour

사실, 나는 정확히 같은 문제를 말할 것이다. 그러나 거기에 주어진 유일한 해결책은 내 응용 프로그램이 적절한 단추를 눌렀을 때 내 UISplitViewController의보기로 스왑하는 기본 메뉴를 가지고 있기 때문에 나에게 적합하지 않습니다. 컨트롤러와 그 안에 포함 된 뷰 컨트롤러는 버튼을 누를 때까지 생성되지 않습니다. 따라서 메인 메뉴가로드 될 때까지 완료되었으므로 [window makeKeyAndVisible]을 호출하기 전에 컨트롤러의 위임을 설정할 수 없습니다.

NSLog(@"Will hide popover view controller!"); 
NSLog(@"self=%p",self); 
NSLog(@"%@",detailPad.tbToolbar); 

내가 세로 모드에서 아이 패드 응용 프로그램을 시작하고 분할 뷰 컨트롤러로 전환을 클릭하면 다음과 같이

지금, 나는 추가 한 일부 NSLog는 대리인의 willHideViewController 함수를 호출 위임자의 willHideViewController가 실제로 호출되지만, 완료되면 세부 뷰에 빈 툴바가 표시됩니다. 이것에 대한 이상한 부분은 디테일 뷰 컨트롤러 툴바에 대한 정보를 출력해야하는 세 번째 NSLog 호출이 대신 (null)을 출력한다는 것입니다. 앞의 코드가 도구 모음의 항목을 설정한다는 사실에 의해 약간 낯선 것입니다.이 코드는 도구 모음이 분명히 존재하지 않지만 단일 예외를 발생시키지 않습니다. 당신이 볼 수 있듯이

[Session started at 2011-02-23 16:16:59 -0500.] 
2011-02-23 16:17:02.626 TEST[33835:207] Will hide popover view controller! 
2011-02-23 16:17:02.628 TEST[33835:207] self=0x5351bc0 
2011-02-23 16:17:02.629 TEST[33835:207] (null) 
2011-02-23 16:17:14.487 TEST[33835:207] Will hide popover view controller! 
2011-02-23 16:17:14.488 TEST[33835:207] self=0x5351bc0 
2011-02-23 16:17:14.490 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>> 
2011-02-23 16:24:52.158 TEST[33835:207] Will hide popover view controller! 
2011-02-23 16:24:52.159 TEST[33835:207] self=0x5351bc0 
2011-02-23 16:24:52.160 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>> 

, 이후 로그는 도구 모음이 잘 살아 있고 것을 보여, 우리는 호출이 모든 경우에 동일한 개체에서 오는 알고있다. 나중에 전화가 가로로 돌아간 후 다시 세로로 돌아 왔기 때문에 전화가 똑같이 디테일 뷰 컨트롤러가되었습니다.

그럼 내 질문은 다음과 같습니다. 툴바가 처음으로 null로 돌아 오지 만 iPad를 돌리면서 아무것도하지 않고 제대로 작동하면 무엇을 해결할 수 있습니까? 사전에

감사합니다, 라이언

답변

1

그리고 ... 내가 해결 방법을 발견했다. 마스터보기 컨트롤러를 일반적으로 괜찮 았던 분할보기 컨트롤러의 대리자로 설정해야했습니다. 그러나 willHideViewController가 처음 호출되면 상세 뷰가 설정되기 전에 실제로 발생합니다. 그래서 툴바가 아직 존재하지 않습니다. 세부 컨트롤러로 여러 가지를 옮겨 대신 대리자로 만들었습니다. 그런 다음 willHideViewController에서 툴바의 항목을 설정하는 것 외에도 viewDidLoad에서도 툴바의 항목을 설정합니다. 마스터는 새로운 디테일 뷰 컨트롤러를 생성하고 popover 버튼을 즉시 할당 할 수 있어야하기 때문에 디테일 뷰 컨트롤러는 popover 버튼과 컨트롤러를 마스터 뷰 컨트롤러에 넘깁니다 (이전에는 디테일 뷰 컨트롤러가 푸시되었음을 언급하지 않았습니다. 네비게이션 컨트롤러에서 터짐).

예쁘지 않지만 작동합니다.

0

Ryan

나는 당신과 똑같은 문제에 부딪 쳤고, 이것은 정말로 도움이되었습니다. 솔루션에 약간의 변형이있었습니다. 몇 가지 핵심 사항.

나는 Master를 UISplitViewControllerDelegate로 남겼지 만, Controller.H를 자세히 보았을 때이 속성을 추가했다.m) :

@property (nonatomic, strong) UIBarButtonItem *popoverButton; 

그런 다음 호출, 마스터 뷰 컨트롤러의 prepareForSegue에, 나는 그 속성에 저장된 UIBarButtonItem을 얻었다.

그런 다음 세부보기 컨트롤러의 viewDidLoad에서 툴바에 해당 항목을 설정했습니다.

-(void) viewDidLoad{ 
[super viewDidLoad]; 
[self setSplitViewBarButtonItem:self.popoverButton];} 

-(void) setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem{ 
if (_splitViewBarButtonItem!=splitViewBarButtonItem) { 
    NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy]; 
    if (_splitViewBarButtonItem) { 
     [toolbarItems removeObject:_splitViewBarButtonItem]; 
    } 
    if (splitViewBarButtonItem) { 
     [toolbarItems insertObject:splitViewBarButtonItem atIndex:0]; 
    } 
    self.toolbar.items=toolbarItems; 
    _splitViewBarButtonItem = splitViewBarButtonItem; 
} 

}

그것은 TOTAL 해킹 같은 느낌,하지만 콘센트가 상세 뷰 컨트롤러에 self.toolbar 할 경우 어떻게가, 당신이있는 viewDidLoad에서 때까지 존재 나던 할 사람?

관련 문제