Agregar UINavigationItem a UINavigationController que envuelve Google Drive OAuth
Pregunta
Objetivo:Para la conexión a iOS de Google Drive, envuelva el iOS de Google OAuth vista controlador en una programación de navegación creado controlador, y agregar un botón de Cancelar para permitir al usuario cancelar el Google OAuth proceso, en caso de que decidan hacerlo.
Problema:Mientras yo de éxito se puede envolver el OAuth vista controlador en un controlador de navegación, no puedo parecer para agregar un elemento de navegación, tales como el deseado botón Cancelar.
Puedo agregar un controlador de navegación que envuelve el Google Drive OAuth controlador de vista, de la siguiente manera...
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 mayor claridad, la variable parentTVC
es una propiedad pública,
@property (nonatomic, strong) UITableViewController *parentTVC;
y se establece mediante una costumbre método init, de la siguiente manera...
- (id)initWithParentTVC:(UITableViewController *)tvc {
self = [super init];
[self setParentTVC:tvc];
return self;
}
He intentado agregar UINavigationItem
s a la UINavigationController
ejemplo navController
, sin embargo , esto no funciona, y en su lugar me parece que se quedó con la UIView
con los dos botones (< y >) en el archivo nib GTMOAuth2ViewTouch.xib, la imagen que se incluye a continuación...
He leído a través de la LGT archivo GTMOAuth2ViewControllerTouch.m
para intentar ver si hay un método que pueden utilizar o si puedo reemplazar por subclases, pero no estoy seguro en mi intento de hacer esto.
Mi mejor conjetura es que cualquier controlador de navegación envolver el OAuth controlador de vista establecidos por este código de GTMOAuth2ViewControllerTouch.m
...
- (void)setUpNavigation {
rightBarButtonItem_.customView = navButtonsView_;
self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}
Ayuda por favor?
Solución
Este es mi re-interpretación de Imran Khan's una excelente respuesta proporcionada en su respuesta a este desbordamiento de pila pregunta: Google Drive SDK de iOS:Pantalla Cancelar Botón De Inicio De Sesión
El googleAuthCheck
el método debe ser llamado en el viewDidLoad o viewWillAppear método de la matriz de controlador de vista.(Asumo aquí una comprensión razonable de iOS de Google Drive SDK, así, hágamelo saber si necesito agregar más aclaración.)
También, aunque un pequeño problema, el uso de initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
requiere que sólo el texto del título de la vista controlador, a continuación, necesita ser localizada (si la aplicación de localización).
- (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 mayor claridad, el buttonCancelTapped:
el método es el siguiente...
- (IBAction)buttonCancelTapped:(UIBarButtonItem *)sender {
[self.parentTVC dismissViewControllerAnimated:YES completion:^(void){}];
}
Para mayor claridad, la variable parentTVC
es una propiedad pública,
@property (nonatomic, strong) UITableViewController *parentTVC;
y se establece mediante una costumbre método init, de la siguiente manera...
- (id)initWithParentTVC:(UITableViewController *)tvc {
self = [super init];
[self setParentTVC:tvc];
return self;
}
Esta costumbre método init es llamado el padre de controlador de vista.