我创建了一个仅在我的应用首次启动时出现的屏幕;它很棒。但是,我想在我的根视图控制器上以模态方式显示此屏幕(EditorsNoteViewController是我想在首次启动时以模态方式呈现的屏幕)。有谁知道我会怎么做?以下是我到目前为止的情况:
Appdelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedOnce"])
{
NSLog(@"not first launch");
self.viewController = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"articlesNav"];
self.window.rootViewController = self.viewController;
}
else
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedOnce"];
[[NSUserDefaults standardUserDefaults] synchronize];
self.viewController = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"articlesNav"];
self.window.rootViewController = self.viewController;
EditorsNoteViewController *vc = [[EditorsNoteViewController alloc]init];
[self.viewController.navigationController presentViewController:vc animated:YES completion:nil];
}
[self.window makeKeyAndVisible];
return YES;
}
答案 0 :(得分:5)
我发现你必须打电话
[self.window makeKeyAndVisible];
在呈现视图控制器之前
答案 1 :(得分:1)
我已多次阅读并遇到此问题。完全解决此问题(没有任何闪烁或警告)的方法是考虑一个自定义容器视图控制器,它将包含您的根视图控制器和模态显示的视图控制器,作为子视图控制器。然后,容器视图控制器可以使用自定义动画在两者之间进行切换,效果与现有/解除非常相似。
让我们考虑以下容器视图控制器:
@implementation ContainerViewController {
NSMutableArray* stack;
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
stack = [NSMutableArray new];
}
return self;
}
- (void) pushViewController:(UIViewController*) viewController {
UIViewController* currentViewController = [stack lastObject];
[stack addObject:viewController];
if (self.isViewLoaded) {
[self addChildViewController:viewController];
[currentViewController willMoveToParentViewController:nil];
viewController.view.frame = CGRectOffset(self.view.bounds, 0, self.view.bounds.size.height);
[self transitionFromViewController:currentViewController toViewController:viewController duration:0.3 options:kNilOptions animations:^{
viewController.view.frame = self.view.bounds;
} completion:^(BOOL finished) {
[viewController didMoveToParentViewController:self];
[currentViewController removeFromParentViewController];
}];
}
}
- (void) popViewController {
UIViewController* currentViewController = [stack lastObject];
[stack removeLastObject];
if (self.isViewLoaded) {
UIViewController* viewController = [stack lastObject];
[self addChildViewController:viewController];
[currentViewController willMoveToParentViewController:nil];
[self transitionFromViewController:currentViewController toViewController:viewController duration:0.3 options:kNilOptions animations:^{
[self.view sendSubviewToBack:viewController.view];
currentViewController.view.frame = CGRectOffset(self.view.bounds, 0, self.view.bounds.size.height);
} completion:^(BOOL finished) {
[viewController didMoveToParentViewController:self];
[currentViewController removeFromParentViewController];
}];
}
}
- (void)viewDidLoad {
[super viewDidLoad];
UIViewController* viewController = [stack lastObject];
[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
@end
在AppDelegate中,您可以获得以下内容:
ContainerViewController* viewController = [ContainerViewController new];
[viewController pushViewController: [RootViewController new];
if ([self shouldPresentModalViewController]) {
[viewController pushViewController: [ModalViewController new];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
在模态视图控制器中的某个位置,您可以使用以下代码将其关闭:
[((ContainerViewController*) self.parentViewController) popViewController];
答案 2 :(得分:0)
假设您已在故事板中创建了EditorsNoteViewController,您应该像这样初始化它:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
EditorsNoteViewController *vc = (EditorsNoteViewController*)[storyboard instantiateViewControllerWithIdentifier:@"EditorsNoteOrWhateverIdentifierYouChose"];
尝试检查RootViewController -viewDidLoad中的NSUserDefaults,如果是第一次,请在那里展示新的UIViewController(这样你就不需要乱用你的AppDelegate了。)
如果要将其呈现为动画,可以在-viewDidAppear而不是-viewDidLoad中进行。