呈现视图控制器时的UIViewControllerHierarchyInconsistency

时间:2015-02-09 05:13:35

标签: ios objective-c uitableview uinavigationcontroller slcomposeviewcontroller

我有这样的View Controller结构:UINavigationController(root view controller)->UIViewController。在我的UIViewController我有动态单元格UITableView。在每个单元格中都有“共享”按钮,它显示全屏UIWindow。这个UIWindow包含一个带有社交网络按钮的UIView,每个按钮都必须显示共享对话框,一切都只适用于与社交网络框架或库一起使用的按钮,但我有一个必须提供自定义的按钮分享对话。当我按下它时,我的应用程序崩溃并出现以下错误:*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'adding a root view controller <REComposeViewController: 0x7f9e8b416260> as a child of view controller:<AVMNavCon: 0x7f9e887540f0>'

这就是我尝试展示对话框的方式:

-(void)shareWithLinkedIn:(AVMSocNetButton*)sender{
[self closeWhiteView]; // close UIWindow with social network buttons
REComposeViewController *composeViewController =  [[REComposeViewController alloc] init]; // define and initialize custom share dialog
composeViewController.title = @"Social";
composeViewController.hasAttachment = YES;
composeViewController.attachmentImage = sender.shareImage;
composeViewController.text = [NSString stringWithFormat:@"Share text"];
testWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 74, SCREEN_WIDTH-10, SCREEN_HEIGHT/2)];
testWindow.windowLevel = UIWindowLevelStatusBar;
testWindow.hidden = NO;

testWindow.rootViewController = composeViewController;
[composeViewController presentFromRootViewController];

[self performSelector:@selector(showShareWindow) withObject:nil afterDelay:1];
}

每个人都可以在这里看到我使用另一个UIWindow(testWindow)。这是因为如果我在没有UIWindow的情况下显示我的对话框,我的UIViewController会逐渐消失,我会看到黑色背景上的分享对话框。 然后,如果我对行testWindow.rootViewController = composeViewController;发表评论,我会看到我想要的分享对话框,但没有任何互动(我无法触摸屏幕上的任何地方的按钮)     我该如何呈现对话框并避免此错误?

修改

完整层级为:UINavigationController - &gt; UIViewController - &gt; UITableView - &gt; UITableViewCell - &gt; UIButton - &gt;(调用“ WhiteView“UIWindow) - &gt; UIWindow - &gt; UIButton - &gt;(调用shareWithLinkedIn方法)

2 个答案:

答案 0 :(得分:1)

您不应该尝试使用窗口的根视图控制器作为模态。如果您想使用窗口实现此转换,请使用带有清晰背景的空UIViewController作为rootViewController,然后将composeViewController作为模式显示。

你可以在不使用Windows的情况下完成你想要做的事情。例如,在iOS 8上,对UIModalPresentationOverFullScreen使用modalPresentationStyle作为composeViewController,并将其作为当前控制器的模态显示。同样,你需要一个透明的容器视图来做到这一点,但它比引入另一个窗口更清晰。在iOS 7上,您需要使用UIModalPresentationCustom(默认情况下似乎与UIModalPresentationOverFullScreen具有相同的效果)

答案 1 :(得分:0)

您要做的就是在根视图控制器上显示您的VC:

- (void)shareWithLinkedIn:(AVMSocNetButton*)sender{
   REComposeViewController *composeViewController =  [[REComposeViewController alloc] init]; // define and initialize custom share dialog
   composeViewController.title = @"Social";
   composeViewController.hasAttachment = YES;
   composeViewController.attachmentImage = sender.shareImage;
   composeViewController.text = [NSString stringWithFormat:@"Share text"];

   [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:composeViewController animated:YES completion:nil];
}