【问题标题】:popping a view controller in different tab在不同的选项卡中弹出视图控制器
【发布时间】:2015-09-22 12:30:08
【问题描述】:

更新 这段代码似乎做了我想做的事,但我很好奇这是否是一个糟糕的策略。

func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
    print("pop view controller from tab bar")

    if tabBarController.selectedIndex == 2 {
        print("appdel detected index 2 tab")
        let navCont = viewController as! UINavigationController
        navCont.popToRootViewControllerAnimated(true)
    }
}

原始问题: 我有一些代码会删除另一个选项卡引用的数据。我想确保当此代码在 [Edit Record VC] 中执行时,即使代码在其自己的选项卡上执行,它也会强制选项卡弹回根视图:

[ ---------------TAB BAR CONTROLLER ------------------ ]
  TAB 0              TAB 1         TAB 2           TAB 3
     |                 |              |              |
     |                 |              |              |
  [NAV CONTR 0]  [NAV CONTR 1]  [NAV CONTR 2]  [NAV CONTR 3]
                       |              |        
                       |              |  
                   [Table VC]      [Map VC]
                       \              /
                        \            /
                         \          /
                       [View Record VC]
                               |
                               |
                       [Edit Record VC]

在上图中,当我在 [Edit Record VC] 中删除一条记录时,我想将 Nav Controller 1 和 Nav Controller 2 弹出到第一个 VC。我怎样才能做到这一点?我已经尝试了我能想到的所有方法,但代码无法正常工作。

我想这样做的原因是因为如果 NAV CONTR 2 导航到 [Edit Record VC] 并删除记录,[View Record VC] 仍将引用该记录,导致它指向已删除的对象。当我在删除后尝试打开 NAV CONTR 2 选项卡时,会导致崩溃

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    对事件做出反应的多个对象听起来像是 NSNotification 的工作。

    制作导航控制器子类的 NAV CONTR 1 和 NAV CONTR 2 实例,用于监听通知(resetToFirstController 或其他)。将发布该通知作为删除逻辑的一部分。

    当每个控制器收到通知时,它会弹出到其根...或您选择的任何“安全”控制器。

    【讨论】:

    • 如果您同意我在回答中的实施,请告诉我。如果您有任何改进以使其更好,请告诉我。
    【解决方案2】:

    我想向 Phillip Mills 展示我所做的实际实现,效果非常棒。

    首先请参考这篇关于NSNotification的帖子,(NotificationCenter issue on Swift 3),这是对swift3中语法的一个很好的参考。

    因此,在您希望能够弹出到导航的根控制器的控制器中,您需要添加以下功能,其中 print 是可选的,但很有用,以便您了解发生了什么。

        // MARK: - Notifications
        func resetToTopView(notification: NSNotification){
            _ = navigationController?.popToViewController(self, animated: true)
            print("poppedViewController for TABNAMEHERE Successfully!")
        }
    

    接下来你需要注册这个函数,以便通知中心调用它。只需在同一个控制器的 viewDidLoad 中添加如下 NotificationCenter 代码即可。

    func viewDidLoad() {
            super.viewDidLoad()
    
            NotificationCenter.default.addObserver(self, selector: #selector(self.resetToTopView(notification:)), name: k_resetToTopViewForYourTabNotification, object: nil)
    }
    

    如果你没有在你的程序中为 k_resetToTopViewForYourTabNotification 设置常量,上面的代码会报错。我通常会在名为 globals 的地方创建一个文件,将这些常量放在其中。

    要定义它,请在此处放置类似的内容。

    let k_resetToTopViewForYourTabNotification = Notification.Name("resetToTopViewForYourTabNotification")
    

    然后在另一个选项卡或代码中的任何其他位置,甚至是不同的选项卡中,如果您想调用该函数以将视图控制器弹出回根目录,您只需调用此命令。

    NotificationCenter.default.post(name: k_resetToTopViewForYourTabNotification, object: nil)
    

    真的很简单很好:)。

    【讨论】:

    • 对我来说,这个答案非常有价值。使用我在这里学到的知识并将其与 stackoverflow.com/questions/38204703/… 结合使用,我能够解决我的问题,我的应用现在可以按我的意愿运行。
    【解决方案3】:

    第一种情况:当你想选择其他标签索引时

    guard let VCS = self.navigationController?.viewControllers else {return }
    for controller in VCS {
        if controller.isKind(of: TabBarController.self) {
            let tabVC = controller as! TabBarController
            tabVC.selectedIndex = index . (Select any index for tab)
            self.navigationController?.popToRootViewController(animated: true)
        }
    }
    

    第二种情况:当你想访问RootViewController变量时

    guard let VCS = self.navigationController?.viewControllers else {return }
    for controller in VCS {
        if controller.isKind(of: TabBarController.self) {
            let tabVC = controller as! TabBarController
            //    tabVC.selectedIndex = 0 . //no need of this line if you want to access same tab where you have started your navigation
            let VCs = tabVC.selectedViewController as! MyViewController
            VCs.variableName = true . //access your variable
            self.navigationController?.popToRootViewController(animated: true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多