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