我的应用程序有一个设置屏幕,如果满足某些条件,该屏幕应以模态方式呈现在根视图控制器上。
我已经在 SO 和互联网上四处查看,到目前为止,关于如何执行此操作的最接近的答案在这里:
AppDelegate、rootViewController 和 PresentViewController https://stackoverflow.com/questions/13430179/appdelegate-rootviewcontroller-and-presentviewcontroller
然而这种方法有两个问题:
- 在 iOS 8 中,这样做会使控制台中出现一条日志,这似乎不是一个错误,但可能仍然不好:
Unbalanced calls to begin/end appearance transitions for UITabBarController: 0x7fe20058d570.
- 当应用程序启动时,根视图控制器实际上会非常短暂地显示,然后淡入所呈现的视图控制器(即使我明确调用
animated:NO
on my presentViewController
方法)。
我知道我可以动态设置我的根控制器applicationDidFinishLaunchingWithOptions:
但我特别想以模态方式呈现设置屏幕,以便当用户完成它时,它会关闭并显示应用程序的真正第一个视图。这就是说,我不想将我的根视图控制器动态更改为我的设置屏幕,并在用户完成设置后以模态方式呈现我的应用程序体验。
在我的根视图控制器上呈现视图控制器viewDidLoad
当应用程序首次启动时,该方法还会导致 UI 明显闪烁。
在应用程序呈现任何内容之前,是否可以以编程方式以模态方式呈现视图控制器,以便第一个视图是模态视图控制器?
UPDATE:感谢您的评论,按照建议添加我当前的代码:
In my 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 之外,我觉得很奇怪,因为我在没有动画的情况下呈现它,并且淡入淡出并不是模态的方式无论如何都会呈现视图控制器。
唯一让我接近的是在根视图控制器的视图 did load 方法中手动添加视图,如下所示:
- (void)viewDidLoad
{
[self.view addSubview:setupViewController.view];
[self addChildViewController:setupViewController];
}
这种方法的问题是,我不能再“本机”关闭 setupViewController,现在需要处理视图层次结构并自己将其动画化,如果这是唯一的解决方案,那很好,但我希望有一个在根视图控制器显示之前,在没有动画的情况下以模态方式添加视图控制器的批准方法。
更新2:经过尝试了很多事情并等待了两个月的答案后,这个问题提出了最具创意的解决方案:
iOS 在启动时显示模态视图控制器而不使用 Flash https://stackoverflow.com/questions/26355847/ios-present-modal-view-controller-on-startup-without-flash
我想是时候接受这一点了这是不可能的在根视图控制器出现之前以模态方式呈现没有动画的视图。然而,该线程中的建议是创建启动屏幕的实例,并将其保持比默认状态更长的时间,直到模式视图控制器有机会呈现自己。