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 UINavigationItems 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...

GTMOAuth2ViewTouch.xib

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top