Вопрос

Цель:Для подключения к Google Диску iOS оберните контроллер представления Google OAuth iOS в программно созданный контроллер навигации и добавьте кнопку «Отмена», чтобы пользователь мог отменить процесс Google OAuth, если он захочет это сделать.

Проблема:Хотя я могу успешно обернуть контроллер представления OAuth в контроллер навигации, я не могу добавить элемент навигации, например нужную кнопку «Отмена».

Я добавляю контроллер навигации, который обертывает контроллер представления Google Drive OAuth, следующим образом:

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];
}

Для ясности переменная parentTVC является общественной собственностью,

@property (nonatomic, strong) UITableViewController *parentTVC;

и устанавливается с использованием специального метода инициализации следующим образом:

- (id)initWithParentTVC:(UITableViewController *)tvc {
    self = [super init];
    [self setParentTVC:tvc];

    return self;
}

Я попытался добавить UINavigationItems к UINavigationController пример navController, однако это не работает, и вместо этого я, кажется, застрял с UIView с двумя маленькими кнопками (< и >) в файле пера GTMOAuth2ViewTouch.xib, изображение приведено ниже...

GTMOAuth2ViewTouch.xib

Я прочитал файл GTL GTMOAuth2ViewControllerTouch.m чтобы попытаться увидеть, есть ли метод, который я мог бы использовать, или я могу переопределить его путем создания подклассов, но я не уверен в своих попытках сделать это.

Я предполагаю, что любой навигационный контроллер, обертывающий контроллер представления OAuth, установленный этим кодом из GTMOAuth2ViewControllerTouch.m...

- (void)setUpNavigation {
  rightBarButtonItem_.customView = navButtonsView_;
  self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}

Помогите, пожалуйста?

Это было полезно?

Решение

Это моя новая интерпретация Имран Ханотличный ответ, представленный в его ответе на этот вопрос о переполнении стека: SDK Google Диска для iOS:Отображение кнопки отмены входа в систему

А googleAuthCheck Метод следует вызывать либо в методе viewDidLoad, либо в методе viewWillAppear родительского контроллера представления.(Я предполагаю, что здесь имеется достаточное понимание iOS Google Drive SDK, поэтому дайте мне знать, если мне нужно добавить дополнительные разъяснения.)

Кроме того, хотя и небольшая проблема, использование initWithBarButtonSystemItem:UIBarButtonSystemItemCancel требует, чтобы затем был локализован только текст заголовка контроллера представления (если вы реализуете локализацию).

- (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];
    }
}

Для ясности, buttonCancelTapped: метод следующий...

- (IBAction)buttonCancelTapped:(UIBarButtonItem *)sender {
    [self.parentTVC dismissViewControllerAnimated:YES completion:^(void){}];
}

Для ясности, переменная parentTVC является общественной собственностью,

@property (nonatomic, strong) UITableViewController *parentTVC;

и устанавливается с использованием специального метода инициализации следующим образом:

- (id)initWithParentTVC:(UITableViewController *)tvc {
    self = [super init];
    [self setParentTVC:tvc];

    return self;
}

Этот пользовательский метод инициализации вызывается из родительского контроллера представления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top