簡體   English   中英

如何將視圖控制器推送到iOS中標簽欄中的導航控制器

[英]how to push a view controller to a navigation controller in a tab bar in iOS

我有一個標簽欄控制器,每個標簽有一個導航控制器。 導航控制器具有視圖控制器。 然后,如果用戶需要登錄或注銷,我的登錄控制器沒有連接到我用以下代碼調用的標簽欄控制器。

當我嘗試根據用戶是否登錄時有條件地推送視圖控制器時,我看到一些奇怪的行為。

我的邏輯看起來像這樣:

if(currentUser){
}else{

        LoginViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
        svc.hidesBottomBarWhenPushed = YES;
        [self.navigationController pushViewController:svc animated:YES];

    }

按下視圖時,看起來好像已按下了“登錄視圖”,並且在其上方推送了另一個“登錄視圖”。

對於注銷,我在segue中有相同的代碼:

if ([segue.identifier isEqualToString:@"LogoutView"]) {

        [self logOut];
        LoginViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"];
        svc.hidesBottomBarWhenPushed = YES;
        [self.navigationController pushViewController:svc animated:YES];
    }

在這個例子中,我看到相同的雙推,每次我點擊我的登錄按鈕,它推動另一個登錄視圖。 這種情況無限發生。 然后我收到警告:

在意外狀態下完成導航過渡。 導航欄子視圖樹可能已損壞。

當我在導航中按回來時,應用程序崩潰並顯示錯誤:

NSInvalidArgumentException',原因:'無法將自己添加為子視圖'

我沒有正確推送登錄視圖控制器嗎?

Segues實例化新控制器,並執行從源控制器到目標控制器的轉換。 因此,您既不應該在代碼中實例化控制器,也不應該使用pushViewController推送它:animated:。 如果按鈕(而不是控制器)正在觸發segue,那么您只需要獲取對目標控制器的引用(segue.destinationViewController),並使用它來隱藏底欄,

-(void)prepareForSegue:(UIStoryboardSegue *) segue sender:(id) sender {

    if ([segue.identifier isEqualToString:@"LogoutView"]) {

            [self logOut];
            LoginViewController *svc = segue.destinationViewController;
            svc.hidesBottomBarWhenPushed = YES;
    }
}

如果您需要有條件地執行此操作,則segue應直接從控制器連接,而不是按鈕。 然后你需要調用performSegueWithIdentifier:在某種方法中你有邏輯來確定應該執行哪個(或者是否)segue。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM