Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Switch between two UIWindows

I am integrating Pushwoosh SDK for Push Notification, which is using UIWindow to represent HTML page sent from Pushwoosh portal

- (void) showWebView {
    self.richPushWindow.alpha = 0.0f;
    self.richPushWindow.windowLevel = UIWindowLevelStatusBar + 1.0f;
    self.richPushWindow.hidden = NO;
    self.richPushWindow.transform = CGAffineTransformMakeScale(0.01, 0.01);

    [UIView animateWithDuration:0.3 animations:^{
        self.richPushWindow.transform = CGAffineTransformIdentity;
        self.richPushWindow.alpha = 1.0f;
    } completion:^(BOOL finished) {
    }];

}

- (void) showPushPage:(NSString *)pageId {
    NSString *url = [NSString stringWithFormat:kServiceHtmlContentFormatUrl, pageId];
    HtmlWebViewController *vc = [[HtmlWebViewController alloc] initWithURLString:url];
    vc.delegate = self;
    vc.supportedOrientations = supportedOrientations;

    self.richPushWindow.rootViewController = vc;
    [vc view];
}

And on closing on HTML page it calls

self.richPushWindow.transform = CGAffineTransformIdentity;
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
    self.richPushWindow.transform = CGAffineTransformMakeScale(0.01, 0.01);
    self.richPushWindow.alpha = 0.0f;


} completion:^(BOOL finished) {
    AppDelegate * appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

    self.richPushWindow.hidden = YES;


}];

Now I want to call my view controller on closing of this HTML page. So I tried to present myviewcotrlller in this block completion but not presenting.

Actually here problem is that there are two UIWindows in my app one of app and other used by sdk. Now if i try to present view controller from this html page which is on separate UIWindow so it creates a separate hierarchy and when i close this window also removes my presented viewconroller due to parent-child relationship. And if do not close this window then how to come back to actual flow of app.

I want that new controller should be presented from that new window and after that window should be close and flow of app should not be affected by additional window. Is it possible? If my concept is wrong, Please help if anyone has idea

Edit: second uiwindow never be key window, it only becomes visible by setting higher windowlevel and become hidden

like image 779
Archive Avatar asked Nov 12 '22 06:11

Archive


1 Answers

The problem is that right after this completion block richPushWindow will be gone, effectively this means you are trying to present view controller on a hidden window.

The solution is very simple. Use main window to present view controller. Some pseudocode:

Add view from the ViewContoller to the main window subviews:

  1. [appDelegate.window addSubview:myViewController.view];

Modal:

  1. [appDelegate.window.rootViewController presentModalViewController:myViewController]

Using View Controller hierarchy:

  1. Push your viewController to the main viewController stack. For example if you have navigationController, just push it there.

I hope it helps!

like image 141
shader Avatar answered Nov 15 '22 06:11

shader