2014-09-22 3 views
13

iOS 8에서 앱을 테스트 한 후 뷰 컨트롤러 초기화 및 프리젠 테이션이 정말 느리게 진행되는 것을 느낍니다. 이제 다음 0.5 초와 볼 나타납니다iOS 8 - 키 윈도우를 설정하거나 다른 앱을 닫은 후 곧바로 View Controller를 표시 할 때 글리치가 발생합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    .... 

    [self.window setRootViewController:_rootController]; 
    [self.window makeKeyAndVisible]; 

    // Conditions 

    if (#first launch condition#) { 
     // quite small controller containing Welcome showcase 
     WelcomeViewController *w = .... 
     [_rootViewController presentViewController:w animated:NO]; 
    } 

    else if (#last opened item condition#) { 
     // pretty big container, root view controller contains 
     // a grid view which opens Item detail container the same way 
     ItemDetailController *item = .... 
     [_rootViewController presentViewController:item animated:NO]; 
    } 

} 

이것은 아이폰 OS 8. 루트 뷰 컨트롤러와 정말 부진 지옥되었다 :

나는 아이폰 OS 6에 다음과 유사한 코드 & 7에서 작동하는 데 사용 표시된 화면으로 즉시 화면을 다시 그립니다. 또한 프레젠테이션이 느려지므로 Unbalanced calls to begin/end appearance transitions _rootViewController 경고가 발생하기 시작했습니다. 그런

[self performSelector:@selector(postAppFinishedPresentation) withObject:nil afterDelay:0]; 

또는 뭔가를 :

초기 빠른 힌트는 다른 기능 통화를 가진 두 조건을 모두 이동이 다음 메인 실행 루프에서 처리 그래서 지연이 제로로 전화를했다. 이것은 언밸런스 드 호출 문제를 해결하지만 시각적 인 차이 (rootviewcontroller, gap, presented one)는 (분명히) 더 커집니다.

당신은 평소처럼 뭔가를 호출 할 때 프리젠 테이션의 속도 저하는 분명하다 : 부모 뷰 컨트롤러의 볼 영화에없이 직접 전환을 수행하는 데 사용되는 코드의 완전히 공정한 조각해야

// Example: Delegate caught finished Sign In dialog, 
//   dismiss it and instantly switch to Profile controller 

-(void)signInViewControllerDidFinishedSuccessfully 
{ 
    [self dismissViewControllerAnimated:NO completion:^{ 
     UserProfileViewController *userProfile = ... 
     [self presentViewController:userProfile animated:NO]; 
    }]; 
} 

을 iOS 7. 이제, 똑같은 일이 생깁니다. 전환 도중 부모가 제스처를합니다. 심지어 애니메이션 없이도 처리됩니다.

아무도 문제가되지 않습니까? 어떤 해결책? 내가 흠 잡을 데없이 통과해야 할 각 일에 대해 UIWindow와 함께 들뜬 마술을 할 필요없이이 문제를 해결하고 싶습니다.

+0

이 문제도 발생하지만 아직 해결 방법을 찾지 못했습니다. –

+0

솔루션을 찾았습니까? –

+0

동일한 유형의 문제도 다루고 있습니다. 해결책이 아직 없습니다. 내 코드에서 iOS 7은 아름답게 작동하지만 iOS 8은 diswiss/present viewController 콤보 사이에 끔찍한 지연이 있습니다. 동일한 애니메이션 블록에서 두 통화를 사용하지 않으려 고 시도했습니다. 애니메이션이없는 동일한 호출에서 두 가지 모두 시도했지만 아직 아무것도 아닙니다. iOS 8에는 너무 많은 숨겨진 선물이 있습니다. –

답변

0

스토리 보드를 사용하는 경우, 왜 시도하지 : 지연이 여기에 없다처럼

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]]; 
ViewController *_rootController = [storyboard instantiateViewControllerWithIdentifier:@"root"]; 
[self.window setRootViewController:_rootController]; 
[self.window makeKeyAndVisible]; 
if (vcToShow == 1) { 
    ViewController2 *w = [storyboard instantiateViewControllerWithIdentifier:@"vc2"]; 
    [_rootController presentViewController:w animated:NO completion:nil]; 
} 
else if (vcToShow == 2) { 
    ViewController2 *w = [storyboard instantiateViewControllerWithIdentifier:@"vc3"]; 
    [_rootController presentViewController:w animated:NO completion:nil]; 
} 

것 같습니다.

0

해고/선물 쌍으로부터받은 지연은 이것으로 수정되었습니다. 그것은 당신의 인스턴스를 도울 수도 안할 수도 있습니다. 내가 나중에 VC2으로 수행하고 일단 내가 같은 호출에 VC1 및 VC2를 모두 기각, 그래서

[_rootViewController presentViewController:vc1 animated:NO completion:nil]; 

if(iNeedToDisplayVC2) { 
    [vc1 presentViewController:vc2 animated:NO completion:nil]; 
} 

: 나는 완전히 아이폰 OS 8에서 모달 뷰 컨트롤러를 기각/표시 내 전략을 변경했다. 이 전략은 iOS 7에서도 작동합니다. 나는 이전 버전들도 사용한다고 가정하지만 그것들을 테스트하지는 않았다.

0

iOS8을 사용하면 완료 블록에서 이전 프레젠테이션이 아직 완료되지 않았으며 즉시 닫기 또는 닫기를 호출하면 콘솔 메시지가 표시되고 현재/해제가 발생하지 않는 것으로 나타났습니다.

[self dismissViewControllerAnimated:NO completion:^{ 
     UserProfileViewController *userProfile = ... 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
      [self presentViewController:userProfile animated:NO]; 
     }]; 
    }]; 
1

내가 요구 사항이 거기에 루트 뷰 컨트롤러와 현재 아무것도로 제한됩니다 확실하지 않다 : 나는 더 지연된 두 번째 프레젠테이션에 수행 추가하여 어느 정도 성공을 있었다.

하지만 코드에 따르면 환영 컨트롤러를 볼 수 있으며이 경우에는이 로직이 더 유용하다고 생각합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Conditions 

    if (#first launch condition#) { 
     // quite small controller containing Welcome showcase 
     WelcomeViewController *w = .... 

     //It can be navigation or tab bar controller which have "w" as rootviewcontroller 
     [self.window setRootViewController:w]; 
    } 

    else if (#last opened item condition#) { 
     // pretty big container, root view controller contains 
     // a grid view which opens Item detail container the same way 
     ItemDetailController *item = .... 
     //It can be navigation or tab bar controller which have "item" as rootviewcontroller 
     [self.window setRootViewController:item]; 
    } 

    [self.window makeKeyAndVisible]; 

} 
+0

음, UIWindow 사용에 대한 요구 사항이나 제한이 없으므로 부분적으로는이 방법이 유용 할 수 있습니다. 그러나 앱을 완전히 독창적으로 구현해야합니다. 일부 창 관리자와이 항목으로 가정 해 봅시다. 그러나 이것은 일반적으로 약간 진보 된 흐름입니다. – michi