Search code examples
iosipaduisplitviewcontrollerios5.1

iOS 5.1 UISplitviewcontroller not allow presentModalViewController from RootViewController


I use to show a viewcontroller from RootViewcontroller of a splitviewcontroller using the following code. It will not shown any thing in iOS 5.1 portrait mode. when landscape it shows the controller inside the Rootviewcontroller. Its works fine upto iOS 5.0.

-(void)displayFileInReader:(NSURL *)fileURL    {

    SPDocumentReader *objiPadDocumentReader = [[SPDocumentReader alloc] init];
    objiPadDocumentReader.readerType = ReaderTypeLocalCachedDocument;
    objiPadDocumentReader.url = fileURL;
    UINavigationController *objNavigationController = [[UINavigationController alloc] initWithRootViewController:objiPadDocumentReader];
    objNavigationController.navigationBar.barStyle = UIBarStyleBlack;

    [self presentModalViewController:objNavigationController animated:YES];

    [objNavigationController release];
    objNavigationController = nil;

    [objiPadDocumentReader release];
    objiPadDocumentReader = nil;
}

I use self.splitviewcontroller and use detailviewcontroller instance instead of self.

But it this case when we click o detailview controller to dismiss/remove rootviewcontroller it cause crash saying something like "no window for the view".

Also sometimes in iOS 5.1 the RootView shows in wrong orientation.

thanks in advance


Solution

  • At last I found the solution,

    I think the issue may due to the split-view did not able to close the root-view controller when we try to present a view controller over it. I changed the above function like this

    -(void)displayFileInReader:(NSURL *)fileURL
    {
        SPDocumentReader *objiPadDocumentReader = [[SPDocumentReader alloc] init];
        objiPadDocumentReader.readerType = ReaderTypeLocalCachedDocument;
        objiPadDocumentReader.url = fileURL;
        UINavigationController *objNavigationController = [[UINavigationController alloc] initWithRootViewController:objiPadDocumentReader];
        objNavigationController.navigationBar.barStyle = UIBarStyleBlack;
    
        //to dismiss the splitview popover -to solve iOS5.1 splitview issue.
        [self.delegate dismissSplitViewPopOverController];
    
        [self presentModalViewController:objNavigationController animated:YES];
    
        [objNavigationController release];
        objNavigationController = nil;
    
        [objiPadDocumentReader release];
        objiPadDocumentReader = nil;
    }
    

    Here I pasted the split-view delegate that allow me to find the split-view popover.

    #pragma mark - UISplitView delegate
    
    // Called when rotating to a portrait orientation.
    - (void)splitViewController: (UISplitViewController*)svc
         willHideViewController:(UIViewController *)aViewController
              withBarButtonItem:(UIBarButtonItem*)barButtonItem
           forPopoverController: (UIPopoverController*)pc {
    
        barButtonItem.title = SPLocaleString(@"[Navigator]");
        self.navigationItem.leftBarButtonItem = barButtonItem;
    
        splitPopoverController = pc;
        [splitPopoverController retain];
    }
    
    // Called when the view is shown again in the split view, invalidating the button and popover controller.
    - (void)splitViewController: (UISplitViewController*)svc
         willShowViewController:(UIViewController *)aViewController
      invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
    
        self.navigationItem.leftBarButtonItem = nil;
    
        [splitPopoverController release];
        splitPopoverController = nil;
    }
    
    -(void)splitViewController:(UISplitViewController *)svc
             popoverController:(UIPopoverController *)pc
     willPresentViewController:(UIViewController *)aViewController
    {
        if (splitPopoverController)
        {
            [splitPopoverController release];
            splitPopoverController = nil;
        }
    
        splitPopoverController = pc;
        [splitPopoverController retain];
    }
    
    - (void)dismissSplitViewPopOverController {
        // If a popover controller is visible, hide it
        if (splitPopoverController) {
            [splitPopoverController dismissPopoverAnimated:NO];
            [splitPopoverController release];
            splitPopoverController = nil;
        } 
    }
    

    thank god,