Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone pushViewController不工作_Iphone_Objective C_Ios - Fatal编程技术网

Iphone pushViewController不工作

Iphone pushViewController不工作,iphone,objective-c,ios,Iphone,Objective C,Ios,我对Objective-C和iPhone编程相当陌生,所以如果这是一个新手问题,我很抱歉。我有一个简单的应用程序,需要从一个视图转到另一个视图。第一个视图是UIViewController。我在IB中设置了xib文件(即,将一些按钮拖到窗口上),并连接了所有按钮(所有按钮都可以工作)。然后我创建了另一个xib文件和类(也是一个UIViewController),并将它们连接起来。在第一个视图中按下按钮时,我想加载第二个视图。下面是应该推动视图的代码: -(IBAction)createAccou

我对Objective-C和iPhone编程相当陌生,所以如果这是一个新手问题,我很抱歉。我有一个简单的应用程序,需要从一个视图转到另一个视图。第一个视图是UIViewController。我在IB中设置了xib文件(即,将一些按钮拖到窗口上),并连接了所有按钮(所有按钮都可以工作)。然后我创建了另一个xib文件和类(也是一个UIViewController),并将它们连接起来。在第一个视图中按下按钮时,我想加载第二个视图。下面是应该推动视图的代码:

-(IBAction)createAccount:(id)sender{
    CreateAccountViewController*acctView = [[CreateAccountViewController alloc] initWithNibName:@"CreateAccount" bundle:nil];
    [self.navigationController pushViewController:acctView animated:YES];
    [acctView release];
}
但这没有任何作用。当我在createAccount方法中放入print语句时,这些语句将被打印(我可以多次单击该按钮,它不会崩溃),但acctView从未被按下。当我打印出self.navigationController的值时,它返回null。更奇怪的是,如果我以某种方式呈现acctView,它就会起作用

-(IBAction)createAccount:(id)sender{
    CreateAccountViewController*acctView = [[CreateAccountViewController alloc] initWithNibName:@"CreateAccount" bundle:nil];
    [self presentModalViewController:acctView animated:YES];
    [acctView release];
}


这工作得很好,但我不想使用视图模式。我在这里完全迷路了。在过去的几个小时里,我遇到了很多帖子,说要用UINavigationController做点什么,然后把它和我的视图连接起来,但是我该怎么做呢?非常感谢您的帮助!谢谢。

您似乎还没有为应用程序创建UINavigationController

最好的办法是从一个新的Xcode项目开始,注意选择一个基于导航的应用程序。通过这种方式,您将获得几乎所有已为您设置的内容

如果不喜欢这种方法,可以通过编程方式创建UINavigationController。你可以找到一个这样做的教程

如果您更喜欢直截了当的说明,请参见:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

     MainPageDialog *overviewViewController = [[MainPageDialog alloc] initWithNibName:@"MainPage" bundle:nil];
     self.navigation = [[[UINavigationController alloc] initWithRootController:overviewViewController] autorelease];
     [overviewViewController release];

     [window addSubview:[navigation view]];
     [self.window makeKeyAndVisible];

     return YES;
}
其中,
self.navigation
是appDelegate中的
retain
ed属性

编辑:

此答案非常陈旧,因此需要更新:

  • 如果使用ARC,则应使用
    strong
    (与
    retain
    )属性,而不需要
    自动释放

  • 如果您的目标是iOS>4.0(这也是上述要点所暗示的),您可以使用
    UIWindow
    中的
    rootViewController
    属性并说:

     MainPageDialog *overviewViewController = [[MainPageDialog alloc] initWithNibName:@"MainPage" bundle:nil];
     self.window.rootViewController = [[[UINavigationController alloc] initWithRootController:overviewViewController] autorelease];
     [overviewViewController release];
    
     [window addSubview:[self.window.rootViewController view]];
     [self.window makeKeyAndVisible];
    
    无需任何
    导航
    属性


  • 你确定你有导航控制器吗?尝试NSLog(@“%@”,self.navigationController);当我这样做时,它会打印self.navigationController为空。这是多年来我在Stack Overflow中看到的“为什么我的pushViewController不工作”类型问题的最佳答案。简洁明了。谢谢塞吉奥,这是不对的。您应该使用self.window.rootViewController=navigation;然后释放导航,而不是[window addSubview:[navigation view]]@奥利弗:谢谢你的评论。答案非常陈旧,因此没有考虑
    rootViewController
    ,代码片段来自外部源,但您肯定是对的,尤其是关于
    发行版
    。我添加了几点,以使答案更切合时宜(且正确)。