2011-11-27 2 views
0

OAuth 2.0을 실험하고 있습니다. 인증 서버가 통신 할 수있는 캔버스로 UIWebView가 포함 된 창을 가져옵니다. 지금은 자체보기 컨트롤러가있는 모달보기로 표시되며 뒤로 단추 또는 취소 단추가 없습니다. 따라서 사용자는 로그인 프로세스에서 벗어날 수 없습니다.기존 iOS 앱에 탐색 컨트롤러를 추가하는 데 성공하지 못했습니다.

WebView의보기 컨트롤러를 푸시 할 수 있도록 내비게이션 컨트롤러에서 webView를 처리하고 싶습니다.

이렇게하는 데 문제가 있습니다. 그것은 내가 바로 루트 뷰 컨트롤러는하지만이

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

처럼, 메인 뷰 컨트롤러되고있는 UINavigationController가 객체를 생성 할 수 있어야한다 날 것으로 보인다,이 라인은 디버거에서 오류 메시지없이 프로그램을 충돌합니다.

[navController pushViewController:windowController animated:YES]; 

그러나, 첫 번째 줄을지나 점점없이, 내가 운동을 시작할 수 없습니다

나는 내가 다음과 같이 위의 라인 직후 웹보기 컨트롤러를 밀어 줄을 배치 할 수 있다고 생각 웹보기를 가져 와서 뒤로 버튼을 표시하고 구성하는 방법에 대한 세부 정보.

업데이트

다음은 일부 컨텍스트입니다. 이것은 단일보기 응용 프로그램에 있습니다. 다음 코드는 메인보기 컨트롤러에 있으며 로그인 대화 상자를 불러옵니다. presentModalViewController가 호출되는 마지막 줄을 windowController를 navController 스택으로 밀어 넣고 싶습니다. 마지막에 네비게이션 컨트롤러의 초기화가 위치한 주석 처리 된 코드를 확인하십시오.

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

글쎄, 당신은 모달 컨트롤러로이를 제시 할 수 있습니다 :

- (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이 방법을 설정합니다. dismissModalViewController : button 또는 windowController의 다른 이벤트에 대한 응답으로 dismissModalViewController를 호출하면됩니다.

그러나 만약 당신이 탐색 컨트롤러를 사용하려는 경우, 당신은 응용 프로그램에서이를 설정할 수 있습니다 : 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

관련 문제