如何将NavigationViewController添加到使用ViewController模板创建的项目中

时间:2010-10-10 01:56:19

标签: iphone cocoa-touch uikit uiviewcontroller uinavigationcontroller

我在xCode中使用基于视图的应用程序模板创建了一个新应用程序。

我的第一个视图,在加载应用时显示,是一个基于按钮的菜单。其中一个按钮(Make)应使用NavigationViewController加载新的导航堆栈。实现时还有其他按钮可以执行NavigationViewController范围之外的其他操作。

我希望能够点击Make并打开并显示一个新的导航控制器。

来自ViewController.m:

-(IBAction)makeStory:(id)sender{
NSLog(@"makeStory:");
navController = [[UINavigationController alloc] init];
makeStoryTableViewController = [[MakeStoryTableViewController alloc] initWithNibName:@"MakeStoryTableViewController" bundle:nil];

[navController pushViewController:makeStoryTableViewController animated:YES];

}

我在打开的ViewController.h文件中创建了一个NavigationViewController:

#import <UIKit/UIKit.h>
#import "MakeStoryTableViewController.h" 
@interface StoryBotViewController : UIViewController {
UINavigationController *navController;
MakeStoryTableViewController *makeStoryTableViewController;

}
- (IBAction)makeStory:(id)sender;
@end

我知道我错过了一些东西,因为当我调用pushViewController时没有任何反应 - 我认为我必须将NavigationViewController附加到makeStory的ViewController中。

作为参考,我的app delegate头在@implementation中声明了视图控制器,如下所示:

    UIWindow *window;
    StoryBotViewController *viewController;

在app delegate的.m中使用相应的@synthesize

@synthesize window;
@synthesize viewController;

如何从打开的视图控制器上启动NavigationStack? 如果问题有点模糊,请原谅我,如果您需要,我很乐意提供更多信息。这是我第一次质疑stackoverflow,我显然是iPhone SDK的新手。

1 个答案:

答案 0 :(得分:1)

你几乎得到了它。但是您忘了将NavigationController添加到视图中。

[self.view addSubview:navController.view];

在您的IBAction中添加此项。


修改

但很可能这不是你想要的,因为你无法导航回你的第一个viewController。如果要导航回第一个viewController,请在基于导航的模板中设置项目。您可以通过以编程方式执行此操作:

将所有UINavigationController内容从viewcontroller的头文件移动到app delegate头。并将您的应用委托代理实施更改为以下内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.
    navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    // Add the view controller's view to the window and display.
    //    [window addSubview:viewController.view];
    [window addSubview:navController.view];
    [window makeKeyAndVisible];
    return YES;
}

确保在dealloc

中发布navController

然后用这样的东西替换你的IBAction:

- (IBAction)makeStory:(id)sender {
    makeStoryTableViewController = [[MakeStoryTableViewController alloc] initWithNibName:@"MakeStoryTableViewController" bundle:nil];
    [self.navigationController pushViewController:makeStoryTableViewController animated:YES];
}

如果您不想在第一个viewcontroller中显示导航栏,请隐藏它,但如果您在堆栈上推送其他项目,请确保取消隐藏它。 self.navigationController.navigationBar.hidden = ...