尝试将导航控制器添加到现有iOS应用程序但未成功

尝试将导航控制器添加到现有iOS应用程序但未成功,ios,uinavigationcontroller,Ios,Uinavigationcontroller,我正在试用OAuth2.0。这将打开一个包含UIWebView的窗口,作为身份验证服务器进行通信的画布。现在,它显示为具有自己的视图控制器的模式视图,没有后退按钮或取消按钮。因此,用户无法从登录过程中逃脱 我想让导航控制器处理webView,这样我就可以推送webView的视图控制器 我做这件事有困难。在我看来,我应该能够创建一个UINavigationController对象,根视图控制器是主视图控制器,如下所示 UINavigationController *navController =

我正在试用OAuth2.0。这将打开一个包含UIWebView的窗口,作为身份验证服务器进行通信的画布。现在,它显示为具有自己的视图控制器的模式视图,没有后退按钮或取消按钮。因此,用户无法从登录过程中逃脱

我想让导航控制器处理webView,这样我就可以推送webView的视图控制器

我做这件事有困难。在我看来,我应该能够创建一个UINavigationController对象,根视图控制器是主视图控制器,如下所示

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self];
但是,这一行使程序崩溃,调试器中没有任何错误消息

我想我可以在上面的一行之后立即放置一行来推动web view控制器,如下所示:

[navController pushViewController:windowController animated:YES];
但是,如果没有通过第一行,我就无法开始计算让web视图显示然后配置back按钮的详细信息

更新

这里有一些背景。这是一个单视图应用程序。以下代码位于主视图控制器中,它将打开登录对话框。我想将调用presentModalViewController的最后一行替换为将windowController推送到navController堆栈上。请注意末尾的注释代码,导航控制器的初始化位于此处

- (IBAction)signInClicked:(id)sender {

    if (![self isSignedIn]) {
        // Sign in
        [self runSigninThenInvokeSelector:@selector(updateUI)];
    }

    [self updateUI];

}


- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {
    NSString *clientID = mClientId; 
    NSString *clientSecret = mClientSecret; 


    // Show the OAuth 2 sign-in controller
    NSString *scope = [GDataServiceGoogleBlogger authorizationScope];

      GTMOAuth2ViewControllerTouch *windowController;

    windowController = [[GTMOAuth2ViewControllerTouch controllerWithScope:(NSString *)scope
                                                                clientID:(NSString *)clientID
                                                            clientSecret:(NSString *)clientSecret
                                                        keychainItemName:(NSString *)kKeychainItemName
                                                                delegate:(id)self
                                                        finishedSelector:@selector(windowController:finishedWithAuth:error:)] retain];

    //UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self];  // This causes a crash when it is not commented out.

    [self presentModalViewController:windowController animated:YES];

}
应用程序委托didFinishLaunchingWithOptions的设置方式如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[blogSpotViewController alloc] initWithNibName:@"myNibName" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;

    [self.window makeKeyAndVisible];
    return YES;
}

您可以将其表示为模态控制器。您只需要安排调用dismissModalViewController:以响应“windowController”上的按钮或其他事件

但如果您想使用导航控制器,则可以在application:didfishlaunchingwithoptions:like so中进行设置:

// create window here like now

blogSpotViewController *viewController = [[blogSpotViewController alloc] initWithNibName:@"myNibName" bundle:nil];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];

[viewController release];

// TODO: hold onto this navController in a property if you really need that.

self.window.rootViewController = navController;

[navController release];

// present window here as you are now
这会将主视图控制器嵌入到导航控制器中。然后回到你的竞选中来选民:你可以

[self.navigationController pushViewController:windowController animated:YES];

希望这能为您指明正确的方向。

您能提供一些关于这些代码行放置位置的上下文吗?谢谢。请看我上面的更新。谢谢。这很有效。我还不太明白为什么。原始行self.window.rootViewController=self.viewController;我仍然感到困惑,我本以为会像你建议的那样。