Aggiungi uinavisticationItem a UinavigationController che avvolge Google Drive Oauth
Domanda
Obiettivo : Per il collegamento a IOS Google Drive, avvolgere il controller di visualizzazione IOS Google Oauth in un controller di navigazione creato a livello programmatico e aggiungere un pulsante Annulla per consentire all'utente di annullare il processo di Google OAuth, dovrebbe scelgono di farlo.
Problema : Mentre posso avvolgere con successo il controller di visualizzazione OAUTH in un controller di navigazione, non riesco a aggiungere un elemento di navigazione, ad esempio il pulsante Annulla desiderato.
Aggiungo un controller di navigazione che avvolge il controller di visualizzazione di Google Drive OAuth, come segue ...
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];
}
.
Per chiarezza, la variabile parentTVC
è una proprietà pubblica,
@property (nonatomic, strong) UITableViewController *parentTVC;
.
ed è impostato utilizzando un metodo di init personalizzato, come segue ...
- (id)initWithParentTVC:(UITableViewController *)tvc {
self = [super init];
[self setParentTVC:tvc];
return self;
}
.
Ho tentato di aggiungere UINavigationItem
s all'istanza UINavigationController
navController
, tuttavia questo non funziona, e invece sembro essere bloccato con il UIView
con i due piccoli pulsanti (
Ho letto attraverso il file GTL GTMOAuth2ViewControllerTouch.m
per tentare di vedere se c'è un metodo che potrei usare l'uso o se posso sovrascrivere dalla sottoclassamento, ma non sono fiducioso nei miei tentativi di farlo.
La mia migliore ipotesi è che qualsiasi controller di navigazione che avvolge il controller di visualizzazione OAUTH impostata da questo codice da GTMOAuth2ViewControllerTouch.m
...
- (void)setUpNavigation {
rightBarButtonItem_.customView = navButtonsView_;
self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}
.
Assistenza per favore?
Soluzione
Questa è la mia reinterpretazione di IMRAN KHAN Eccellente risposta fornita nella sua risposta a questo stack overflow Domanda: Google Drive IOS SDK: display Annulla il pulsante di accesso < / P >.
Il metodo googleAuthCheck
deve essere chiamato nel metodo ViewDidDload o ViewWillappear del controller di visualizzazione dei genitori. (Suppongo qui una ragionevole comprensione dell'IS Google Drive SDK, quindi fammi sapere se ho bisogno di aggiungere ulteriori chiarimenti.)
Inoltre, anche se un piccolo problema, utilizzando initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
richiede che solo il testo del titolo del controller di visualizzazione deve essere localizzato (se si sta implementando la localizzazione).
- (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];
}
}
.
per chiarezza , il metodo buttonCancelTapped:
è il seguente ...
- (IBAction)buttonCancelTapped:(UIBarButtonItem *)sender {
[self.parentTVC dismissViewControllerAnimated:YES completion:^(void){}];
}
.
per chiarezza , la variabile parentTVC
è una proprietà pubblica,
@property (nonatomic, strong) UITableViewController *parentTVC;
.
ed è impostato utilizzando un metodo di init personalizzato, come segue ...
- (id)initWithParentTVC:(UITableViewController *)tvc {
self = [super init];
[self setParentTVC:tvc];
return self;
}
.
Questo metodo di init personalizzato è chiamato dal controller della vista genitore.