Iphone 由viewDidLoad启动时未正确添加UINavigationController

Iphone 由viewDidLoad启动时未正确添加UINavigationController,iphone,objective-c,ios,uinavigationcontroller,viewdidload,Iphone,Objective C,Ios,Uinavigationcontroller,Viewdidload,可能重复: 我有一个函数,startApp,它看起来像这样: - (void)startApp { NSLog(@"startApp initiated"); aNavController = [[UINavigationController alloc] initWithNibName:nil bundle:nil]; [self presentModalViewController:aNavController animated:YES]; } 当通过按钮调用时,如: - (IBAct

可能重复:

我有一个函数,startApp,它看起来像这样:

- (void)startApp {
NSLog(@"startApp initiated");

aNavController = [[UINavigationController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:aNavController animated:YES]; }
当通过按钮调用时,如:

- (IBAction)showSettings:(id)sender {
[self startApp]; }
它工作正常,但由viewDidLoad调用,如:

- (void)viewDidLoad {
[super viewDidLoad];
[self startApp]; }
输出“startApp initiated”,但导航控制器不显示。我不知道这是为什么,似乎他们应该以同样的方式工作?在同一个文件中。有人知道为什么这不能正常工作吗

谢谢,,
Tobias Tovedal

在viewDidLoad中,您试图用导航视图覆盖现有视图。这将适用于大多数视图控制器,但我认为UINavigationViewController希望成为应用程序中的根或最底层视图控制器

也许可以实例化导航视图控制器,然后创建要显示在其中的视图


直接从代码中使用导航控制器是很棘手的。如果您使用Xcode的File->New Project创建一个基于导航的应用程序,然后向其中添加任何现有代码,您将有一个轻松得多的时间。

您不能在viewDidLoad方法中显示视图控制器。在ViewDidDisplay中尝试此方法。

在viewdidLoad[self-performSelector:@selector(loadView)with Object:nil afterDelay:1]中编写此方法;现在创建一个方法-(void)loadView{//在这里编写导航代码}

好的,我想我明白你的意思,但是我不明白为什么在viewDidLoad中启动startApp与通过按下按钮启动它有什么不同。其想法是,启动应用程序时,您应该直接导航到应用程序的设置视图。此视图也可以通过按钮按钮来访问,不幸的是,我不认为使用Navigation BasedApp模板创建此应用程序会产生此效果。您是否确实能够通过按下现有应用程序中的按钮来显示导航控制器?调用viewDidLoad时,刚刚加载的视图实际上还没有出现在屏幕上。可能是试图在未完全实例化的UIView上显示导航控制器是行不通的。如果您从ViewDidDisplay调用startApp,它会工作吗?是的,它会显示一个带有导航控制器的视图,因此它会工作。增加
[self startApp]类似这样:
-(void)viewdidappease:(BOOL)动画{[self startApp];}
确实会在启动时显示导航控制器视图,但当我关闭uinva视图时,它会返回,因为该视图随后“出现”并调用viewdidappease,这很棘手:PSo您可能认为这样做是正确的“在未完全实例化的UIView上显示导航控制器根本不起作用”,但我想说到底。我想在ViewDid上添加某种计数器,这样函数只调用一次就可以解决问题,但我认为这不是最好的方法。添加
[self startApp];
to
viewdide
确实会在启动时正确启动该函数,但是每次我回到该视图时,导航控制器都会再次弹出。然后按照堂吉诃德所说的做。创建基于导航的应用程序。不幸的是,这不是一个选项,我的临时解决方案是从TRUE t进行某种形式的值更改o调用ViewDidDisplay时为FALSE,并且只有当该值为TRUE时才让startApp执行。这并不漂亮,但我想它必须这样做。我认为您试图以一种不应该使用的方式使用导航控制器。去看看UINavigationController.h头文件。它是一个非常复杂的类。我非常喜欢它我们知道导航控制器一直被设计成应用程序中的根级视图控制器,并且在其他不受导航控制器控制的视图控制器上实例化它从未被苹果公司测试过。如果它能工作,你就很幸运了。听起来好像不工作。你能做些什么来获得我的许可t工作可能是一个可怕的黑客。@DonQuixote-谢谢你的帮助,Droid的回答解决了我的问题。我猜延迟允许
viewDidLoad
完成根视图的加载,或者其他什么,我只是猜测。太棒了!
[自执行选择器:@selector(startApp)with object:nil afterDelay:1];
在viewDidLoad中解决了它!谢谢你:D