2014-09-22 18 views
13

Vì thử nghiệm ứng dụng của tôi trên iOS 8, tôi thấy một công việc xung quanh khởi tạo bộ điều khiển chế độ xem và trình diễn thực sự chậm.iOS 8 - Trục trặc khi trình bày bộ điều khiển xem nhanh sau khi cài đặt cửa sổ chính hoặc loại bỏ và instanly trình bày khác

Tôi từng làm việc với một mã tương tự như sau trên iOS 6 & 7:

- (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]; 
    } 

} 

này đã trở thành một địa ngục thực sự chậm chạp với iOS điều khiển xem 8. gốc bây giờ xuất hiện rõ ràng cho 0,5-1 thứ hai và sau đó ngay lập tức vẽ lại màn hình bằng trình bày. Hơn nữa, sự chậm chạp của bản trình bày bắt đầu gây ra cảnh báo Unbalanced calls to begin/end appearance transitions _rootViewController.

ban đầu gợi ý nhanh chóng là để di chuyển cả hai điều kiện với các cuộc gọi đến chức năng khác và gọi nó với một độ trễ zero vì vậy nó được chế biến trong vòng lặp chạy chính tiếp theo:

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

hoặc một cái gì đó như thế. Điều này sửa chữa các vấn đề gọi unballanced, nhưng khoảng cách hình ảnh (rootviewcontroller, khoảng cách, trình bày một) trở nên (rõ ràng) thậm chí còn lớn hơn.

Các sự chậm chạp của bài trình bày cũng là hiển nhiên khi bạn gọi một cái gì đó bình thường như:

// 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]; 
    }]; 
} 

mà nên mảnh hoàn toàn hợp lý của mã, trong đó sử dụng để thực hiện quá trình chuyển đổi trực tiếp mà không cần một flick hữu hình của xem cha mẹ điều khiển trên iOS 7. Bây giờ, cùng một điều - flicks phụ huynh trong quá trình chuyển đổi, thậm chí cả hai đều được xử lý mà không có hình ảnh động.

Có ai phải đối mặt với vấn đề này không? Bất kỳ giải pháp? Tôi muốn giải quyết điều này mà không cần phải làm một số ma thuật vui nhộn với UIWindow s cho mỗi điều tôi cần để quá cảnh hoàn hảo.

+0

Tôi đang gặp sự cố này nhưng chưa tìm được giải pháp. –

+0

Bạn đã bao giờ tìm được giải pháp chưa? –

+0

Cũng xử lý cùng loại vấn đề. Chưa có giải pháp nào. Trong mã của tôi, iOS 7 hoạt động rất đẹp nhưng iOS 8 có một sự chậm trễ khủng khiếp giữa một kết hợp sa thải/viewController hiện tại. Đã cố gắng đặt cả hai cuộc gọi trong cùng một khối hoạt ảnh để không có kết quả. Đã thử cả hai trong cùng một cuộc gọi không có hình động, vẫn không có gì. iOS 8 có quá nhiều quà tặng ẩn ... –

Trả lời

0

Nếu bạn sử dụng Storyboard, tại sao không thử:

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]; 
} 

Dường như không có sự chậm trễ ở đây.

0

Sự chậm trễ tôi có từ một cặp bỏ qua/hiện tại đã được khắc phục bằng cách này. Nó có thể hoặc không thể giúp dụ của bạn. Tôi đã hoàn toàn thay đổi chiến lược của tôi hiển thị/bác bỏ điều khiển xem phương thức dưới iOS 8:

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

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

Vì vậy, một lần tôi đang thực hiện với VC2 sau này, tôi bỏ cả VC1 và VC2 trong cuộc gọi tương tự. Chiến lược này cũng hoạt động theo iOS 7. Tôi giả sử các phiên bản trước đó nhưng tôi đã không kiểm tra chúng.

0

Với iOS8, tôi thấy bản trình bày cũ chưa hoàn thành trong khối hoàn thành và việc bỏ qua hoặc hiển thị ngay lập tức có thể dẫn đến thông báo điều khiển và đôi khi hiện tại/bỏ qua thậm chí không xảy ra. Tôi đã có một số thành công bằng cách thêm một thêm trì hoãn thực hiện để trình bày thứ hai:

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

Tôi không chắc chắn yêu cầu bị hạn chế để có cái nhìn gốc điều khiển và bất cứ điều gì có mặt ở đó.

Nhưng theo mã của bạn, nó có bộ điều khiển xem chào mừng và tôi nghĩ trong trường hợp này, logic này hữu ích hơn.

- (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

Vâng, không có yêu cầu hoặc giới hạn về việc sử dụng 'UIWindow', vì vậy điều này có thể là một phần, nhưng yêu cầu ứng dụng phải được triển khai hoàn toàn khác - hãy giả sử với một số trình quản lý cửa sổ và công cụ này. Nhưng điều này nói chung là một chút tiến bộ. – michi

Các vấn đề liên quan