iOS 5.1中,UISplitViewController不允许从RootViewController呈现模态视图控制器。

3

我曾使用以下代码从SplitViewcontroller的Rootviewcontroller中显示一个viewcontroller。在iOS 5.1竖屏模式下不会显示任何内容。当横向时,它会在Rootviewcontroller内显示控制器。在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;
}

我使用 self.splitviewcontroller 并使用 detailviewcontroller实例 代替 self。

但在这种情况下,当我们点击 detailview controller 来解除/删除 rootviewcontroller 时,会导致崩溃,显示类似于“视图没有窗口”的错误信息。

此外,在 iOS 5.1 中,根视图有时会显示错误的方向。

提前感谢。

2个回答

5

最终我找到了解决方案,

我认为问题可能是由于分屏视图在尝试在其上呈现视图控制器时无法关闭根视图控制器所致。 我将上述函数更改为以下内容:

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

我在下面粘贴了一个分屏视图代理,它可以帮助我找到分屏视图的弹出窗口。
#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;
    } 
}

感谢上帝,


1
我能够在5.1中通过NaveenShan的解决方案解决这个问题,但我所需要的唯一一行是在调用presentModalViewController之前调用[popoverController dismissPopoverAnimated:NO];。这样就可以解决问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接