0

目標:要連接到iOS Google Drive,請將iOS Google OAuth視圖控制器包裝在程序創建的導航控制器中,然後添加一個取消按鈕以允許用戶取消Google OAuth流程,他們是否應該選擇這樣做。將UINavigationItem添加到包含Google Drive OAuth的UINavigationController

問題:雖然我可以成功地包住的OAuth視圖控制器在導航控制器,I似乎無法添加導航項目,如所期望的取消按鈕。

我添加了一個導航控制器,它包裝的谷歌驅動器的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; 
} 

我試過泰德UINavigationItem s添加到該UINavigationController實例navController,但是這並不工作,而是我似乎在筆尖文件GTMOAuth2ViewTouch.xib與UIView與兩個小按鈕(<和>)卡,下面的圖片包含.. 。

GTMOAuth2ViewTouch.xib

我已經通過GTL文件GTMOAuth2ViewControllerTouch.m讀取嘗試,看看是否有一種方法我能可能使用或我是否可以通過繼承覆蓋,但我在我的努力做到這一點不自信。

我最好的猜測是,任何導航控制器包裹由GTMOAuth2ViewControllerTouch.m此代碼設置的OAuth視圖控制器...

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

援助嗎?

+0

我道歉...... 就找到了答案在這裏:http://stackoverflow.com/questions/21453691/google-drive-ios-sdk-display-cancel-login-button – andrewbuilder

+0

請註明您的答案是正確的。將有助於他人。 – Shad

+0

謝謝@SHAD會做。我已經嘗試過這一點,但顯然我必須等待2天......?同時,爲了確認,這個答案是正確的,並在我的應用程序中工作。 – andrewbuilder

回答

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

這一習俗從父視圖控制器調用init方法。

相關問題