2011-11-27 39 views
0

我使用OAuth 2.0實驗。它會打開一個包含UIWebView的窗口作爲認證服務器通過的畫布。現在,它被視爲具有自己的視圖控制器的模態視圖,並且沒有後退按鈕或取消按鈕。所以用戶無法擺脫登錄過程。沒有成功嘗試導航控制器添加到現有的iOS應用

我想有一個導航控制器處理,所以我可以推的WebView視圖控制器的web視圖。

我有這樣的問題。在我看來,我應該能夠僅僅創建根視圖控制器作爲主視圖控制器,這樣

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

但是一個UINavigationController對象,此行崩潰程序,而不在調試器中的錯誤信息。

我以爲我可以放置到行後立即推Web視圖控制器上面,像這樣:

[navController pushViewController:windowController animated:YES]; 

但是,沒有得到過去的第一線,我不能開始工作了有關使Web視圖顯示並配置後退按鈕的詳細信息。

UPDATE

下面是一些背景。這是在一個單一的視圖應用程序。以下代碼位於主視圖控制器中,該控制器會顯示登錄對話框。我想通過將windowController推到navController棧上來替換最後一行,即調用presentModalViewController的地方。請注意導航控制器初始化所在的最後註釋代碼。

- (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; 
} 
+0

你能提供身邊,你是把這些代碼行一些背景? –

+0

謝謝。請看看我上面的更新。 – Jim

回答

1

好了,你可以提出這是一個模態控制器。您只需要安排調用dismissModalViewController:響應「windowController」上的按鈕或其他事件。

但是,如果你想使用導航控制器,那麼你就可以設置了在應用中:didFinishLaunchingWithOptions:像這樣:

// 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 

這將嵌入在導航控制器的主視圖控制器。然後回到你的runSigninThenInvokeSelector:你可以...

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

希望指向你在正確的方向。

+0

謝謝。這工作完美。我不明白爲什麼,但是。原來的行** self.window.rootViewController = self.viewController; **仍然讓我感到困惑,而且我會期望像你這樣的建議。 – Jim

相關問題