2012-09-08 3 views
0

오버레이 컨트롤러를로드하는 앱이 있습니다 (스캔 할 수 있도록 카메라를 보여줍니다). 그것은 아이폰에서 잘 작동하고 두 번째 호출 후에는 iPad에서 잘 작동합니다. 설명하겠습니다.컨트롤은 초기로드시 UIPopoverController에서 응답하지 않지만 후속로드에서는 수행합니까?

나는보기 컨트롤러를 모달로로드하는 UIButtonBarItem이 있습니다. 컨트롤러에는 몇 가지 컨트롤이 있으며, 대부분의 버튼 (펜촉으로 정의)이 있습니다. iPhone에서 컨트롤러 (UIButtonBarItem 액션에 응답하여)를로드하면로드되고 모든 버튼이 매번 올바르게 작동합니다.

하지만 ... 내가 UIPopoverController를 사용하여 동일한보기 컨트롤러를로드하면 처음로드 할 때 아무 버튼도 응답하지 않습니다. 따라서 컨트롤러 외부의 화면을 터치하고 컨트롤러를 닫습니다. 그런 다음 컨트롤러가로드 될 때 동일한 동작 버튼을 다시 터치하면보기 컨트롤러의 모든 컨트롤이 잘 작동합니다. 정말 위드!

[가능한 내역] 버튼을 처음로드했을 때 버튼이 이상한 위치에 배치되었습니다. 이후의 각 호출에는 버튼이 올바른 위치에 표시됩니다. 펜촉에서 "Autoresize subviews"를 비활성화하여 작동하도록했습니다. 버튼이 올바른 위치에 있지만 처음으로이 팝업을로드 할 때 여전히 응답하지 않습니다.

다음은 UIButtonBarItem에 응답하는 데 사용하는 코드입니다.

-(void)launchOverlayController:(id)sender 
{ 
if([pickerControllerPopover isPopoverVisible]) 
{ 
    [pickerControllerPopover dismissPopoverAnimated:YES]; 
    pickerControllerPopover = nil; 
    return; 
} 

// Deselect any selected cell 
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:NO]; 


// Working code that shows the overlay (camera on) but the overlay takes the whole screen 
SRSScanVINViewController *scanVINViewController = [[SRSScanVINViewController alloc] init]; 
[pickerController setOverlay:scanVINViewController]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:scanVINViewController]; 
[navController setModalPresentationStyle:UIModalPresentationFormSheet]; 
[navController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
[[UIApplication sharedApplication] setStatusBarHidden:YES]; 
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
{ 
    pickerControllerPopover = [[UIPopoverController alloc] initWithContentViewController:pickerController]; 
    [pickerControllerPopover setDelegate:self]; 
    [pickerControllerPopover setPopoverContentSize:CGSizeMake(320.0f, 460.0f)]; 
    [pickerControllerPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 
else 
{ 
    [self presentViewController:pickerController animated:YES completion:nil]; 
} 

} 

나는 완전히 아이디어가 없습니다. 오버레이 컨트롤러 내의 컨트롤이 처음을 제외하고 항상 호출 할 때마다 제대로 작동하는지 알 수 없습니다.

사전에 도움을 주셔서 감사합니다.

+0

일반 모달보기 컨트롤러 및 PopoverController 아닙니다. 일반 컨트롤러를 사용하는 경우 처음 포함 할 때마다 작동합니다. 할 일이있는 것 같습니다. PopoverController를 사용합니다. – JustLearningAgain

+0

나는 Popover 컨트롤러를 처음 시작했을 때 거의 즉시 작동한다는 것을 알았습니다. 물론 작동하지 않습니다. 이후에 실행할 때마다 정상적으로 작동하지만로드하는 데 2 ​​초 정도 더 걸립니다. 분명히 두 번째로로드 할 때마다 (그리고 그 이후에 매번) 추가적으로 일어나는 일이 있습니다. 디버거를 밟았으며 다르게 호출 된 메서드를 볼 수 없습니다. popover 컨트롤러가 처음으로로드 될 때 (또는 완료되지 않은) 무언가가 있습니까? – JustLearningAgain

+0

문제를 보여주는 작은 데모 프로젝트를 만듭니다. 공용 폴더의 DropBox 계정에 업로드하고 질문을 업데이트하십시오. 실제 코드를 수정하면 누구나 생산성을 향상시킬 수 있습니다. –

답변

2

그래서 대답은 수퍼 클래스가 사용자의 뷰를 골탕 먹이려한다는 것입니다. 나는 그것이 서브 클래 싱되도록 설계되지 않았지만 확실하게 알 방법이 없다고 추측 할 것이다. 'view ..'메소드 중 하나에서 self.view를 자체 뷰로 대체하고 뷰를 해당 뷰의 하위 뷰로 만드는 것이 있습니다. 처음으로보기의 프레임이 0 치수를 갖습니다. 다음 번에 이전에 그대로 남겨 둘 것입니다. 아마도 일부 영구 플래그 일 수 있습니다. 또한 하위보기의 다른 위치에보기를 삽입합니다. 이상하게 보일지라도 코드가 있으면 아마 그 이유를 알 수 있습니다.

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // StackOverflow says to add this TCL? 

    // Set the initial scan orientation 
    [self setLayoutOrientation:self.parentPicker.orientation]; 

    if ([self.parentPicker hasFlash]) 
    { 
     [flashButton setEnabled:YES]; 
     [flashButton setStyle:UIBarButtonItemStyleBordered]; 
     [self.parentPicker turnFlash:NO]; 
    } else 
    { 
     [flashButton setEnabled:NO]; 
    } 

    textCue.text = @""; 
    viewHasAppeared = NO; 

    // move the subviews  
    while([self.view.subviews count]) [self.view.superview addSubview:[self.view.subviews objectAtIndex:0]]; 
    self.view.frame = CGRectMake(0,0,0,0); 
} 

PS : -

soooo의 문제에 대한 해결책은 바로 수퍼 (서브 클래스의 뷰), 다음 널 프레임보기의 프레임을 설정하려면보기의 하위 뷰를 이동하는 것입니다 당신이 있었다 있습니다 여기서 superView 호출이 누락되었지만별로 중요하지 않은 것 같습니다 (복잡한 수퍼 클래스가 원하는 메소드를 알 수 없으므로 사용자가 요격하는 모든 것을 전송할 수 있습니다.)

+0

그게 다야! 훌륭한! 어떻게 그걸 알아 냈습니까? 앞으로도 이런 것들을 찾을 수 있도록 알고 싶습니다. 나는 IOS로 시작하고 배울 것이 많다. – JustLearningAgain

+0

나는 전망을 걷는 몇 가지 루틴을 썼다. 나는 계속 창문에서 어떤 견해를 보거나 감동을 차단하는 견해의 하위 견해를 찾지 않았다. 따라서 추측 해 보면 'self.view.superview'를보고 그 라이브러리가 소유 한 뷰를 보았습니다. 뷰를 버리면 사용중인 뷰가 해당 뷰에서 채워져 있다고 생각하는 것을 보았습니다. 늦은 경기. –

관련 문제