presentViewController 显示在 UIWindow 后面

Posted

技术标签:

【中文标题】presentViewController 显示在 UIWindow 后面【英文标题】:presentViewController is displayed behind UIWindow 【发布时间】:2014-11-20 10:56:35 【问题描述】:

我的应用中有一个UITabBarcontroller,当显示第一次点击时,我使用MyBlurIntroductionView 启动一个教程

为简单起见,设置教程后,我只需将其添加到应用程序的全屏,使用:

[appDelegate.window addSubview:introductionView];

在本教程中,我想提供使用以下代码通过 Twitter 分享的功能:

if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])

    SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    [tweetSheet setInitialText:@"Tweeting from my own app! :)"];
    [parentController setModalPresentationStyle:UIModalPresentationFullScreen];


    [parentController presentViewController:tweetSheet animated:NO completion:nil];
else
    NSLog(@"Not available");

因此,此代码是从教程中调用的,它是一个UIView,并且由于此代码而获得了parentController

UITabBarController *tabbarController =(UITabBarController*)self.window.rootViewController;    
UIViewController *parentController = tabbarController.viewControllers[0]

问题是分享框显示在教程下方(隐藏教程后,我们可以看到分享框),我想把它放在教程上方。

我猜这是因为教程被添加为窗口的子视图,但我不知道如何做不同的事情。

你有一些解决这个问题的技巧吗?

【问题讨论】:

【参考方案1】:

据我所知,我们遇到了一些架构方面的问题......说说 MVC。

通常你将某种 RootViewController 附加到你的 UIWindow。其他一切都从那里开始。使用你的 UIWindow 会导致到处都是问题。

如果这是您第一次打开应用程序,您可以在您的 RootViewController 中检查 viewDidLoad。如果是这样,请创建一个带有您要显示的视图的 TutorialViewController 并呈现 tutorialViewController。如果您的 RootViewController 在 UINavigationController 中,则通过推送您的 tutorialViewController。

[self.navigationController pushViewController:TutorialViewController animated: NO];

或以模态方式呈现。但是由于您也想以模态方式呈现 TwitterViewController,这可能不是一个好主意。至少在过去,ios 在呈现一个以模态呈现的 viewController 时遇到问题:)

[self presentViewController:TutorialViewController animated:YES completion:NULL];

在 tutorialViewController 中,您可以使用 xib、情节提要、- (void)loadView 创建您的 tutorialView - 并设置 Target/Action 以针对您的 TutorialViewController 触发。 ViewControllers 通常是你处理 UI 的地方(也是 UserInteraction)。不要在你的视图中这样做——尤其是在检查 Twitter 依赖项时。

这样,您的项目中的所有内容都是分层的,并且没有隐含的东西,其他开发人员会喜欢打你的。请不要再做这样的 evar ;)

UITabBarController *tabbarController =(UITabBarController*)self.window.rootViewController;    
UIViewController *parentController = tabbarController.viewControllers[0]

您现在的实际问题:您的 parentViewController 在您的 TutorialView 下方。如果你的 parentViewController 以模态方式呈现某些东西,它会将模态呈现的视图添加到它的 viewStack 中,它仍然在你的 tutorialView 下方。但正如我所说,干净的 MVC 架构将防止遇到这些问题。

【讨论】:

【参考方案2】:

尝试在此处添加教程:[[UIApplication sharedApplication] keyWindow] 而不是 appDelegate.window。

【讨论】:

不会改变任何东西。

以上是关于presentViewController 显示在 UIWindow 后面的主要内容,如果未能解决你的问题,请参考以下文章

presentViewController:animated:NO 简要显示 iOS 8 中的呈现控制器。替代方案?

presentViewController 不显示呈现视图控制器上的所有元素

防止在presentViewController上隐藏键盘(显示弹出窗口)

iOS:presentViewController 错误 不鼓励在分离的视图控制器上显示视图控制器

xcode在presentViewController之后更改标签的文本

带有标签栏的 presentViewController