如何在应用程序启动时以模态方式呈现View Controller?

时间:2014-09-08 00:14:24

标签: ios objective-c

我创建了一个仅在我的应用首次启动时出现的屏幕;它很棒。但是,我想在我的根视图控制器上以模态方式显示此屏幕(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;
}

3 个答案:

答案 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中进行。