Unbalanced calls to begin/end appearance transitions for

后端 未结 22 1856
长情又很酷
长情又很酷 2020-11-28 19:23

I read SO about another user encountering similar error, but this error is in different case.

I received this message when I added a View Controller initially:

相关标签:
22条回答
  • 2020-11-28 19:53

    If you're using transitioningDelegate (not the case in this question's example), also set modalPresentationStyle to .Custom.

    Swift

    let vc = storyboard.instantiateViewControllerWithIdentifier("...")
    vc.transitioningDelegate = self
    vc.modalPresentationStyle = .Custom
    
    0 讨论(0)
  • 2020-11-28 19:56

    I had lot of problem with the same issue. I solved this one by

    1. Initiating the ViewController using the storyboad instantiateViewControllerWithIdentifier method. i.e Intro *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"introVC"];
    2. [self.tabBarController presentModalViewController : vc animated:YES];

    I have the viewcontroller in my storyboard, for some reason using only [[introvc alloc] init]; did not work for me.

    0 讨论(0)
  • 2020-11-28 19:57

    I had the same problem. I called a method inside viewDidLoad inside my first UIViewController

    - (void)viewDidLoad{
        [super viewDidLoad];
    
        [self performSelector:@selector(loadingView)
                   withObject:nil afterDelay:0.5];
    }
    
    - (void)loadingView{
    
        [self performSegueWithIdentifier:@"loadedData" sender:self];
    }
    

    Inside the second UIViewController I did the same also with 0.5 seconds delay. After changing the delay to a higher value, it worked fine. It's like the segue can't be performed too fast after another segue.

    0 讨论(0)
  • 2020-11-28 19:58

    I had the same problem when I need to Present My Login View Controller from another View Controller If the the User is't authorized, I did it in ViewDidLoad Method of my Another View Controller ( if not authorized -> presentModalViewController ). When I start to make it in ViewDidAppear method, I solved this problem. I Think that ViewDidLoad only initialize properties and after that the actual showing view algorithm begins! Thats why you must use viewDidAppear method to make modal transitions!

    0 讨论(0)
  • 2020-11-28 19:58

    As @danh suggested, my issue was that I was presenting the modal vc before the UITabBarController was ready. However, I felt uncomfortable relying on a fixed delay before presenting the view controller (from my testing, I needed to use a 0.05-0.1s delay in performSelector:withDelay:). My solution is to add a block that gets called on UITabBarController's viewDidAppear: method:

    PRTabBarController.h:

    @interface PRTabBarController : UITabBarController
    
    @property (nonatomic, copy) void (^viewDidAppearBlock)(BOOL animated);
    
    @end
    

    PRTabBarController.m:

    #import "PRTabBarController.h"
    
    @implementation PRTabBarController
    
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        if (self.viewDidAppearBlock) {
            self.viewDidAppearBlock(animated);
        }
    }
    
    @end
    

    Now in application:didFinishLaunchingWithOptions:

    PRTabBarController *tabBarController = [[PRTabBarController alloc] init];
    
    // UIWindow initialization, etc.
    
    __weak typeof(tabBarController) weakTabBarController = tabBarController;
    tabBarController.viewDidAppearBlock = ^(BOOL animated) {
        MyViewController *viewController = [MyViewController new];
        viewController.modalPresentationStyle = UIModalPresentationOverFullScreen;
        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
        [weakTabBarController.tabBarController presentViewController:navigationController animated:NO completion:nil];
        weakTabBarController.viewDidAppearBlock = nil;
    };
    
    0 讨论(0)
  • 2020-11-28 20:00

    As posted by danh

    You can generate this warning by presenting the modal vc before the app is done initializing. i.e. Start a tabbed application template app and present a modal vc on top of self.tabBarController as the last line in application:didFinishLaunching. Warning appears. Solution: let the stack unwind first, present the modal vc in another method, invoked with a performSelector withDelay:0.0

    Try to move the method into the viewWillAppear and guard it so it does get executed just once (would recommend setting up a property)

    0 讨论(0)
提交回复
热议问题