我有这样的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
方法)
答案 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];
}