将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController

Posted

技术标签:

【中文标题】将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController【英文标题】:Add UINavigationItem to UINavigationController that wraps Google Drive OAuth 【发布时间】:2014-04-11 03:34:47 【问题描述】:

目标:为了连接到 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;

我试图将UINavigationItems 添加到UINavigationController 实例navController,但这不起作用,相反我似乎被UIView 与两个小按钮()卡住了在 nib 文件 GTMOAuth2ViewTouch.xib 中,图片包含在下面...

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

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

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

请帮忙?

【问题讨论】:

抱歉...刚刚在这里找到了答案:***.com/questions/21453691/… 请将您的答案标记为正确。会对其他人有所帮助。 谢谢@SHAD。我已经尝试过了,但显然我必须等待 2 天......?同时,为了确认,这个答案是正确的,并且在我的应用程序中有效。 【参考方案1】:

这是我对Imran Khan 在回答此堆栈溢出问题时提供的出色答案的重新解释:Google Drive iOS SDK: Display Cancel Login Button

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;

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

【讨论】:

以上是关于将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

将 UINavigationItem 设置为 nil 后,如何重新添加它?

检测长按 UINavigationItem 的后退按钮

使用“模态推送”到 viewController 并且无法在顶部添加 UINavigationItem-(Controller, Bar)

UINavigationItem 后退按钮返回到上一个导航项,但视图没有改变

UINavigationItem.titleView 能否成为FirstResponder?

如何在 UINavigationItem 下添加选项卡?