目标: :要连接到 iOS Google Drive,请将 iOS Google OAuth 视图控制器包装在以编程方式创建的导航控制器中,并添加取消按钮以使用户能够取消 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;

并使用自定义 init 方法进行设置,如下所示...

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

    return self;
}

我尝试添加 UINavigationItemUINavigationController 实例 navController, ,但是这不起作用,相反我似乎被困住了 UIView 笔尖文件 GTMOAuth2ViewTouch.xib 中有两个小按钮(< 和 >),图像如下...

GTMOAuth2ViewTouch.xib

我已通读 GTL 文件 GTMOAuth2ViewControllerTouch.m 尝试查看是否有我可以使用的方法或者是否可以通过子类化来覆盖,但我对自己的尝试没有信心。

我最好的猜测是任何包装 OAuth 视图控制器的导航控制器都由此代码设置 GTMOAuth2ViewControllerTouch.m...

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

请帮忙?

有帮助吗?

解决方案

这是我的重新解读 伊姆兰·汗在他对这个堆栈溢出问题的回答中提供了出色的答案: Google 云端硬盘 iOS SDK:显示取消登录按钮

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;

并使用自定义 init 方法进行设置,如下所示...

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

    return self;
}

这个自定义 init 方法是从父视图控制器调用的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top