为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?
Posted
技术标签:
【中文标题】为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?【英文标题】:Why DetailViewController pop to first DetailViewController with Tabbar and Navigation Controller?为什么 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController? 【发布时间】:2019-05-02 11:32:06 【问题描述】:首先我使用的是故事板。我的 ViewController 层次结构像这样NavigationController -> SplashScreen -> LoginScreen -> MainTabBarController -> MainNavigationController -> MainViewController -> DetailViewController
。
当我单击DetailViewController
页面上的按钮时,不会返回MainViewController
。它将前往LoginScreen
。
我在DetailViewController
的addToBasket
操作中尝试了此代码。
@IBAction func addBasket(_ sender: Any)
SingletonCart.sharedFood.food.append(food!)
let mainView = self.storyboard?.instantiateViewController(withIdentifier: "FoodOrder") as! MainViewController
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.navigationController?.popViewController(animated: true)
dismiss(animated: true)
这是我的 loginButton
代码,用于将 MyTabBarController
设置为 rootViewController。
@IBAction func loginButton(_ sender: Any)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "MainTabBarController")
self.window?.rootViewController = viewController
【问题讨论】:
self.navigationController?.popViewController(animated: true) 使用insted of instantiat Food Controller 为什么要使用两个语句返回:popViewController
& dismiss
。只使用一个self.navigationController?.popViewController(animated: true)
而不是这个dismiss(animated: true)
。
【参考方案1】:
在您的方法中,RootViewController 是登录屏幕的导航控制器,因此会出现此问题。
你的方法应该如下:
A) NavigationController -> SplashScreen -> LoginScreen
B) MainTabBarController -> MainNavigationController -> MainViewController -> DetailViewController
当用户登录时,你应该用 B) MainTabBarController 替换你的 window.rootViewController
【讨论】:
当我点击addToBasket
按钮时,我应该控制登录成功与否?如果不是,rootViewController 是第一个NavigationController
?如果是rootViewController是MainTabBarController
?
是的,您可以通过将 window.rootViewController 从 A) 更改为 B) 来实现相同的效果,反之亦然。
我使用 addToBasket 按钮将数据从 DetailVC 传递到 MyCartVC。如果我使用self.navigationController?.popViewController(animated: true)
,我的数据不会传递给 MyCartVC,而是视图控制器从导航堆栈中弹出。如果我使用 dismiss(animated:)
数据传递给 MyCartVC。我只是在上面编辑我的问题。 @Bhavik Modi【参考方案2】:
@IBAction func addBasket(_ sender: Any)
SingletonCart.sharedFood.food.append(food!)
self.navigationController?.popViewController(animated: true)
【讨论】:
以上是关于为啥 DetailViewController 使用 Tabbar 和 Navigation Controller 弹出到第一个 DetailViewController?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 selectedRowAtIndexPath 推送 DetailViewController
如何从 UISearchBarDisplayController 结果到 detailViewController