presenting GTMOAuth2ViewControllerTouch wtih presentViewCont



我需要打开谷歌登录viewController作为一个模态从现有的viewController。没关系,但我不知道如何添加按钮来关闭模态因为我没有使用UINavigationController。有人遇到同样的问题吗?

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];

谢谢

我有同样的问题,最后使用

[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];

但这不是完美的解决方案(非常丑陋和非平面)。我想知道为什么导航栏不显示

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

是的,我们可以手动添加导航栏

UINavigationBar *navBar=[etc…

我认为完美的解决方案是使用新的UIViewTransitions(苹果想强迫我们使用这个?)。

这是我对Imran Khan在他对这个堆栈溢出问题的回答中提供的出色答案的重新解释:Google Drive iOS SDK:显示取消登录按钮

去那里给他的回答投票,我只是复制和转换。

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;

,并使用自定义init方法进行设置,如下所示…

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

这个自定义init方法是从父视图控制器调用的。

Swift版本-针对新用户

扩展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
}

很有魅力

最新更新