2014-10-20 21 views
5

Giả sử ParentViewcontroller là P, FirstViewController là V1 và SecondViewController là V2.viewDidAppear được gọi trên bộ điều khiển xem đang được loại bỏ trong iOS8

Tôi trình bày V1 từ P rồi V2 từ V1. Bây giờ tôi muốn đi trực tiếp đến P. Đối với điều này tôi đang sử dụng

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:NO completion:nil]; 

Điều này hoạt động tốt trong iOS7. Nhưng trong iOS8 tôi đang đối mặt với một vấn đề (không biết đó có phải là vấn đề hay không) khi thực hiện việc này. Đó là phương thức viewDidAppear của V1 đang được gọi và chế độ xem của nó ổn định trên màn hình trong một phần giây.

Đây có phải là lỗi hoặc tính năng iOS8 không ?. Có cách nào khác để làm điều này không?

ViewControllers presenting code.

Từ P, trong đó P là một viewController đẩy,

ViewController1 *v1 = [[ViewController1 alloc] init];  
[self presentViewController:v1 animated:NO completion:nil]; 

Từ V1,

ViewController2 *v2 = [[ViewController2 alloc] init]; 
[self presentViewController:v2 animated:NO completion:nil]; 
+0

Tôi không biết nếu nó sẽ tạo ra bất kỳ sự khác biệt nào, nhưng bỏ quaModalViewControllerAnimated: đã bị khấu hao một thời gian dài trước đây, bạn nên sử dụng dismissViewControllerAnimated: completion :. – rdelmar

+0

Cảm ơn bạn @rdelmar. Đó là một vấn đề dán bản sao. Đã sao chép mã cũ. Đã chỉnh sửa câu hỏi của tôi :). – iCanCode

+0

điều này không giống như một lỗi đối với tôi. Điều đó nên được dự kiến ​​dựa trên những gì bạn đang làm. Làm thế nào bạn trình bày các bộ điều khiển xem? Đăng mã trình bày – Lefteris

Trả lời

0

bạn có thể sử dụng nhúng V1 của bạn trong NavigationController (NV)? Bằng cách này, bạn có thể đẩy V2 của mình. Sau đó, bạn có thể chuyển sang V1 hoặc loại bỏ NV thành P.

+0

Không! Tôi không thể. Tôi có thể goto P. vấn đề của tôi là khi tôi goto P trực tiếp từ V2, xem của V1 ổn cho một phần nhỏ của thứ hai. – iCanCode

0

Sau khi dành nhiều thời gian nghiên cứu kết thúc bằng cách vá sự cố.

Điều tôi đã làm là, trước khi loại bỏ ViewController (V2), tôi đã chụp ảnh màn hình của ParentViewcontroller (P) và thêm nó vào cửa sổ ứng dụng. Sau đó, loại bỏ hình ảnh từ cửa sổ sau khi loại bỏ ViewController (V2).

CGRect deviceRect = [[UIScreen mainScreen] bounds]; 

UIGraphicsBeginImageContextWithOptions(deviceRect.size, NO, [UIScreen mainScreen].scale); 
CGContextRef contextRef = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(contextRef, -deviceRect.origin.x, -deviceRect.origin.y); 
[[self.presentingViewController.presentingViewController.view layer] renderInContext:contextRef]; 
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

UIImageView *windowImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, deviceRect.size.width, deviceRect.size.height)]; 
[windowImageView setImage:capturedImage]; 
[[[UIApplication sharedApplication] keyWindow] addSubview:windowImageView]; 

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:NO completion:^ 
{ 
     [windowImageView removeFromSuperview]; 
}]; 
0

Thực tế là 'viewWill/DidAppear' được gọi khi bạn bỏ qua V1 là logic như về mặt kỹ thuật V1 được tiếp xúc trong việc sa thải modal của viewController đầu (V2), nếu chỉ đủ lâu rằng UIKit sau đó được giao nhiệm vụ để loại bỏ viewController bên dưới tiếp theo (ví dụ V1).

Dự đoán của tôi sẽ là trục trặc thị giác V1 trong iOS8 không phải là lỗi và nhiều hơn nữa để làm với cách iOS đề cập đến việc loại bỏ một phương thức bên trong một phương thức trong iOS8. Vì không có tài liệu nào tồn tại cho tình huống đó, hành vi thực tế của nó có thể thay đổi hợp pháp từ iOS sang iOS.

Tôi nghĩ một cách để làm những gì bạn muốn làm, giữ khả năng tương thích ngược với iOS cũ hơn và sử dụng API với hành vi được ghi lại, sẽ sử dụng mã như dưới đây (có thể là danh mục trên UIViewController). để tạo hiệu ứng V1 lên, sau đó chỉ cần xóa nó (# 2 bên dưới). V2 có thể có thể được làm động bên trong V1 bằng cách sử dụng tiêu chuẩn iOS 'presentViewController', nhưng bạn cũng có thể sử dụng phương pháp # 1 cho nó.

Một lưu ý là vì bạn đang thêm V1.view làm chế độ xem con cho P thay vì thông qua hệ thống phương thức UIViewController, bạn sẽ mất chế độ xem tự độngWill/DidAppear trong V1. Vì vậy, bạn sẽ cần phải gọi những người bằng tay. Trong ví dụ này, chúng được gọi trong phương thức 'animate up'.

Đây không phải là mã tôi thực sự đang sử dụng, nhưng tôi đã thực hiện những việc tương tự trong quá khứ. Vì vậy, hãy cẩn thận một chút và vui lòng nhận xét nếu phát hiện có lỗi .... giả định ARC:

Hy vọng điều này sẽ hữu ích.

//1. animate V1 up (executed from P) 
    ViewController * V1 = [[ViewController1 alloc] init]; 
    //place V1 view below bottom of P 
    V1.view.frame = CGRectMake(0, UI_phone_height, UI_phone_width, UI_phone_height); 
    [self.view addSubview: V1.view]; //'self' is P 
    [V1 customAnimateUpCategory]; 

    // >> method #1 in a UIViewController category 
    - (void) customAnimateUpCategory { 

      //...optional 
      [self viewWillAppear]; 

      [UIView animateWithDuration:0.4 
        animations:^ { 
         //animate V1.view up 
         self.view.frame = CGRectMake(0, 0, UI_phone_width, UI_phone_height); 
        } 
        completion:^ (BOOL finished) { 
         if (finished) { 
          //...optional 
          [self viewDidAppear]; 
         } 
        } 
      ]; 
    } 


    //2. make V1/V2 disappear without animation (executed from V2) 
    //'V1' is weakly held in V2 as an IVAR 
    [self.V1 removeViewCategory] 

    // >> method #2 in a UIViewController category 
    - (void) removeViewCategory { 
      [self.view removeFromSuperview];//should remove and release V1/V2 glitch free!! 
    } 
Các vấn đề liên quan