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 UINavigationItems all'istanza UINavigationController navController, tuttavia questo non funziona, e invece sembro essere bloccato con il UIView con i due piccoli pulsanti () nel file NIB GTMOAUTH2ViewTouch.xib, immagine Incluso sotto ...

GTMOAUTH2ViewTouch.xib

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top