![](/img/trans.png)
[英]Can't push to View Controller from AppDelegate without losing Navigation Bar and Tab Bar setup 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.