【发布时间】:2015-03-30 15:02:04
【问题描述】:
我的应用程序有一个设置屏幕,如果满足某些条件,它应该以模态方式显示在根视图控制器上。
我在 SO 和互联网上环顾四周,到目前为止,关于如何执行此操作的最接近的答案在这里:
AppDelegate, rootViewController and presentViewController
这种方法有两个问题:
- 在 iOS 8 中,这样做会使控制台中出现日志,这似乎不是错误,但可能还是不好:
Unbalanced calls to begin/end appearance transitions for UITabBarController: 0x7fe20058d570.
- 根视图控制器实际上在应用启动时非常短暂地显示,然后淡入呈现的视图控制器(尽管我在
presentViewController方法上明确调用了animated:NO)。
我知道我可以在applicationDidFinishLaunchingWithOptions: 中动态设置我的根控制器,但我特别想以模态方式显示设置屏幕,这样当用户完成它时,它就会关闭并显示应用程序的真实第一个视图.也就是说,我不想将我的根视图控制器动态更改为我的设置屏幕,并在用户完成设置后以模态方式呈现我的应用体验。
在我的根视图控制器 viewDidLoad 方法上显示视图控制器也会导致应用程序首次启动时 UI 明显闪烁。
是否可以在应用程序呈现任何内容之前以编程方式以模态方式呈现视图控制器,以便第一个视图是模态视图控制器?
更新:感谢 cmets,按照建议添加我当前的代码:
在我的AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
[self.window makeKeyAndVisible];
[self.window.rootViewController presentViewController:[storyboard instantiateViewControllerWithIdentifier:@"setupViewController"] animated:NO completion:NULL];
return YES;
}
这可以满足我的需要,除了它会在应用程序启动时短暂显示窗口的根视图控制器一秒钟,然后淡化 setupViewController,我觉得这很奇怪,因为我在没有动画的情况下呈现它并且淡化不是无论如何呈现模态视图控制器。
唯一让我接近的事情是在根视图控制器的视图中手动添加视图确实加载方法如下:
- (void)viewDidLoad
{
[self.view addSubview:setupViewController.view];
[self addChildViewController:setupViewController];
}
这种方法的问题是我不能再“本机”关闭 setupViewController,现在需要自己处理视图层次结构并为其设置动画,如果这是唯一的解决方案,那很好,但我希望在根视图控制器显示之前,有一种认可的方式可以在没有动画的情况下以模态方式添加视图控制器。
更新 2:在尝试了很多事情并等待了 2 个月的答案之后,这个问题提出了最有创意的解决方案:
iOS Present modal view controller on startup without flash
我想是时候接受不可能在根视图控制器出现之前以模态方式呈现没有动画的视图了。然而,该线程中的建议是创建一个启动屏幕的实例,并将其保持比默认设置更长的时间,直到模态视图控制器有机会呈现自己。
【问题讨论】:
-
用相关代码更新您的问题,显示您目前正在做什么。
-
我认为子视图控制器方法实际上是最好的,但我给了你两个选择 - 看看你的想法。
-
我已经在另一个问题中提供了这个问题的答案:stackoverflow.com/q/26355847/1652710 希望这就是你要找的。span>
-
@Stakenborg 谢谢!这一直处于不确定状态,但启动屏幕覆盖是我见过的最具创意的解决方案。我将更新我的问题以指向该线程。
标签: ios objective-c