Adicione UINavigationItem ao UINavigationController que envolve o Google Drive OAuth
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...
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?
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.