为啥 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

我在DetailViewControlleraddToBasket 操作中尝试了此代码。

@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?的主要内容,如果未能解决你的问题,请参考以下文章

为啥界面生成器不显示我的展开转场?

DetailViewController 不能设置网点?

如何从 selectedRowAtIndexPath 推送 DetailViewController

如何从 UISearchBarDisplayController 结果到 detailViewController

更新 UISplitViewController 子类中 DetailViewController 的框架

UITableViewController 并在其上推送 DetailViewController