Pergunta

Meta:Para conexão com o iOS Google Drive, envolva o controlador de visualização iOS Google OAuth em um controlador de navegação criado programaticamente e adicione um botão Cancelar para permitir que o usuário cancele o processo Google OAuth, caso decida fazê-lo.

Problema:Embora eu consiga agrupar com êxito o controlador de visualização OAuth em um controlador de navegação, não consigo adicionar um item de navegação, como o botão Cancelar desejado.

Eu adiciono um controlador de navegação que envolve o controlador de visualização OAuth do Google Drive, da seguinte maneira...

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

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

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

    [navController addChildViewController:authViewController];

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

Para maior clareza, a variável parentTVC é um bem público,

@property (nonatomic, strong) UITableViewController *parentTVC;

e é definido usando um método init personalizado, como segue...

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

    return self;
}

Eu tentei adicionar UINavigationItemé para o UINavigationController instância navController, no entanto, isso não funciona e, em vez disso, parece que estou preso ao UIView com os dois pequenos botões (< e >) no arquivo nib GTMOAuth2ViewTouch.xib, imagem incluída abaixo...

GTMOAuth2ViewTouch.xib

Eu li o arquivo GTL GTMOAuth2ViewControllerTouch.m para tentar ver se existe um método que eu possa usar ou se posso substituir por subclasse, mas não estou confiante em minhas tentativas de fazer isso.

Meu melhor palpite é que qualquer controlador de navegação que envolva o controlador de visualização OAuth definido por este código de GTMOAuth2ViewControllerTouch.m...

- (void)setUpNavigation {
  rightBarButtonItem_.customView = navButtonsView_;
  self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}

Assistência, por favor?

Foi útil?

Solução

Esta é a minha reinterpretação de Imran Khana excelente resposta fornecida em sua resposta a esta pergunta sobre estouro de pilha: SDK do Google Drive para iOS:Exibir botão Cancelar login

O googleAuthCheck deve ser chamado no método viewDidLoad ou viewWillAppear do controlador de visualização pai.(Presumo aqui um entendimento razoável do SDK do Google Drive para iOS, então me avise se precisar adicionar mais esclarecimentos.)

Além disso, embora seja um pequeno problema, usar initWithBarButtonSystemItem:UIBarButtonSystemItemCancel requer que apenas o texto do título do controlador de visualização precise ser localizado (se você estiver implementando a localização).

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

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

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

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

Para maior clareza, o buttonCancelTapped: o método é o seguinte...

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

Para maior clareza, a variável parentTVC é um bem público,

@property (nonatomic, strong) UITableViewController *parentTVC;

e é definido usando um método init personalizado, como segue...

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

    return self;
}

Este método init personalizado é chamado a partir do controlador de visualização pai.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top