Добавьте UINavigationItem в UINavigationController, который обертывает OAuth Google Диска.
Вопрос
Цель:Для подключения к 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;
}
Я попытался добавить UINavigationItem
s к UINavigationController
пример navController
, однако это не работает, и вместо этого я, кажется, застрял с UIView
с двумя маленькими кнопками (< и >) в файле пера 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;
}
Этот пользовательский метод инициализации вызывается из родительского контроллера представления.