viewDidLoad中的presentViewController

Ene*_*emy 3 cocoa objective-c

我正在尝试使用此代码从viewDidLoad使用presentViewController:

@implementation ViewController

- (void)showLogin{
    id animator = [[MyCustomAnimator alloc] init];
    NSViewController* vc = [[MyViewController alloc] initWithNibName:nil bundle:nil];

    [self presentViewController:vc animator:animator];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Presenting ViewController";
    [self showLogin];
}

@end
Run Code Online (Sandbox Code Playgroud)

当我从IBAction按钮调用它时,它工作正常,但是以编程方式进行操作却收到此错误:

 *** Assertion failure in -[ViewController presentViewController:animator:], /Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1404.12/Controllers/NSViewController.m:826

Failed to set (contentViewController) user defined inspected property on (NSWindow): presentViewController:animator:: View '<ViewController: 0x6000000c28b0>''s view is not in a window/view hierarchy.
Run Code Online (Sandbox Code Playgroud)

不知道如何进行,有人可以指出正确的方向吗?

mat*_*att 5

您这样做太早了。viewDidLoad表示视图控制器具有一个视图(这就是单词“ load”的含义),但是该视图不是接口的一部分。因此,没有任何东西可提供。

等到viewDidAppear:。这意味着,视图控制器的观点在接口(这是什么字“出现” 的手段)。

但是要当心,它viewDidAppear:可以多次调用,并且在取消显示的视图控制器时将调用它,从而使您陷入恶性循环。使用某种Bool标志(一种属性)可以防止这种情况。