2014-03-20 2 views
1

Мне нужно открыть google login viewController как модальный из существующего viewController. Это нормально, но я не знаю, как добавить кнопку для закрытия модального, потому что я не использую UINavigationController. У кого-то такая же проблема?, представляющий GTMOAuth2ViewControllerTouch с настоящим представлениемController: анимированный: завершение

GTMOAuth2ViewControllerTouch *viewController; 
     viewController = [GTMOAuth2ViewControllerTouch controllerWithScope:GOOGLE_SCOPE_YOUTUBE 
                    clientID:GOOGLE_CLIENT_ID 
                   clientSecret:GOOGLE_CLIENT_SECRET 
                  keychainItemName:GOOGLE_KEYCHAIN 
                    delegate:self 
                  finishedSelector:finishedSel]; 

     NSDictionary *params = [NSDictionary dictionaryWithObject:@"es" forKey:@"hl"]; 
     viewController.signIn.additionalAuthorizationParameters = params; 
     viewController.signIn.shouldFetchGoogleUserProfile = YES; 
     NSString *html = @"<html><body style=\"font-family:Arial\"><div style=\"text-align:center;\">Cargando página para iniciar sesión...</div></body></html>"; 
     viewController.initialHTMLString = html; 
     [self presentViewController:viewController animated:NO completion:nil]; 

благодаря

+0

См. Этот ответ ... http://stackoverflow.com/questions/21453691/google-drive-ios-sdk-display-cancel-login-button – andrewbuilder

ответ

1

У меня была такая же проблема, и в конечном итоге с помощью

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationDuration:0.75]; 
[self.navigationController pushViewController:detailView animated:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.navigationController.view cache:NO]; 
[UIView commitAnimations]; 

Но это не является идеальным решением (очень некрасиво кстати и не плоский). Я задаюсь вопросом, почему Nav Bar не отображается для

[self presentViewController:viewController animated:NO completion:nil]; 

Да, мы могли бы добавить Nav Bar вручную

UINavigationBar *navBar=[etc… 

Я думаю, что идеальный solution'd бы использовать новые UIViewTransitions (Apple хочет заставить нас использовать это?).

+0

Не могли бы вы рассказать мне, если finalSelector правильно вызывается после успешного входа ? – returnvoid

+0

hmmm ... Я думаю, что это зависит от кода контроллера Google View, а не от самого ViewController. Вы правильно добавили делегата? –

1

Это моя переинтерпретация отличного ответа Imran Khan «s, представленный в его ответ на этот вопрос переполнения стека: Google Drive iOS SDK: Display Cancel Login Button

Перейти туда и вверх голосовать свой ответ, я только скопировал и преобразован.

if (!self.isAuthorized) { 
    SEL selectorFinish = @selector(viewController:finishedWithAuth:error:); 
    SEL selectorButtonCancel = @selector(buttonCancelTapped:); 

    UINavigationController *navController = [[UINavigationController alloc] init]; 

    UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 63)]; 
    UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:<<localised string for title>>]; 
    UIBarButtonItem *barButtonItemCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:selectorButtonCancel]; 

    [navigationItem setRightBarButtonItem:barButtonItemCancel]; 
    [navigationBar setTranslucent:NO]; 
    [navigationBar setItems:[NSArray arrayWithObjects: navigationItem,nil]]; 

    [navController.view addSubview:navigationBar]; 

    GTMOAuth2ViewControllerTouch *authViewController = nil; 
    authViewController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive 
                    clientID:kClientID 
                   clientSecret:kClientSecret 
                  keychainItemName:kKeychainItemName 
                    delegate:self 
                  finishedSelector:selectorFinish]; 

    [navController addChildViewController:authViewController]; 

    [self.parentTVC presentViewController:navController animated:YES completion:nil]; 
} 

Для ясности, метод buttonCancelTapped: выглядит следующим образом ...

- (IBAction)buttonCancelTapped:(UIBarButtonItem *)sender { 
    [self.parentTVC dismissViewControllerAnimated:YES completion:^(void){}]; 
} 

Для ясности, переменная parentTVC является государственной собственностью,

@property (nonatomic, strong) UITableViewController *parentTVC; 

и с использованием пользовательского метода инициализации, следующим образом:

- (id)initWithParentTVC:(UITableViewController *)tvc { 
    self = [super init]; 
    [self setParentTVC:tvc]; 

    return self; 
} 

Этот настраиваемый метод инициализации вызывается из родительского контроллера представления.

1

Swift Version - Для новых пользователей

расширить класс GTMOAuth2ViewControllerTouch

extension GTMOAuth2ViewControllerTouch 
{ 
    public override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     let cancelItem = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: #selector(self.cancelGdriveSignIn)) 
     self.navigationController?.navigationBar.topItem?.rightBarButtonItem = cancelItem 
     self.navigationController?.navigationBar.topItem?.title = "Google Drive" 
    } 

    func cancelGdriveSignIn() 
    { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

И добавить навигационный контроллер перед возвращением ваш AuthController

private func createAuthController() -> UIViewController { 
    let scopeString = scopes.joinWithSeparator(" ") 
    let controller = GTMOAuth2ViewControllerTouch(scope: scopeString, clientID: kClientID, clientSecret: nil, keychainItemName: kKeychainItemName, delegate: self, finishedSelector: #selector(ViewController.viewController(_:finishedWithAuth:error:))) 
    let navController = UINavigationController(rootViewController: controller) 
    return navController 
} 

работает как шарм.

Смежные вопросы