在不同的选项卡中弹出视图控制器
popping a view controller in different tab
更新
这段代码似乎可以满足我的要求,但我很好奇现在这是否是一种糟糕的策略。
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]
在上图中,当我在[编辑记录VC]中删除一条记录时,我想将Nav Controller 1 和Nav Controller 2 弹出到第一个VC。我怎样才能做到这一点?我已经尝试了所有我能想到的方法,但代码就是不工作。
我想这样做的原因是因为如果 NAV CONTR 2 导航到 [编辑记录 VC] 并删除记录,[查看记录 VC] 仍将引用该记录,导致它指向已删除的对象。当我在删除后尝试打开 NAV CONTR 2 选项卡时,它会导致崩溃
多个对象对一个事件做出反应听起来像是 NSNotification
的工作。
创建导航控制器子类的 NAV CONTR 1 和 NAV CONTR 2 实例,用于侦听通知(resetToFirstController
或其他)。将发布该通知作为删除逻辑的一部分。
当每个控制器收到通知时,它会弹出到其根...或您选择的任何 "safe" 控制器。
我想向 Phillip Mills 展示我所做的实际实施,效果非常好。
首先请参考NSNotification上的这个post,(),这是对swift3语法的一个很好的参考。
因此,在您希望能够弹出到导航的根控制器的控制器中,您将需要添加以下功能,打印是可选的,但很有用,因此您可以看到发生了什么。
// 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)
真的很简单也很好:).
第一种情况:当你想select其他tab索引时
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)
}
}
更新 这段代码似乎可以满足我的要求,但我很好奇现在这是否是一种糟糕的策略。
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]
在上图中,当我在[编辑记录VC]中删除一条记录时,我想将Nav Controller 1 和Nav Controller 2 弹出到第一个VC。我怎样才能做到这一点?我已经尝试了所有我能想到的方法,但代码就是不工作。
我想这样做的原因是因为如果 NAV CONTR 2 导航到 [编辑记录 VC] 并删除记录,[查看记录 VC] 仍将引用该记录,导致它指向已删除的对象。当我在删除后尝试打开 NAV CONTR 2 选项卡时,它会导致崩溃
多个对象对一个事件做出反应听起来像是 NSNotification
的工作。
创建导航控制器子类的 NAV CONTR 1 和 NAV CONTR 2 实例,用于侦听通知(resetToFirstController
或其他)。将发布该通知作为删除逻辑的一部分。
当每个控制器收到通知时,它会弹出到其根...或您选择的任何 "safe" 控制器。
我想向 Phillip Mills 展示我所做的实际实施,效果非常好。
首先请参考NSNotification上的这个post,(
因此,在您希望能够弹出到导航的根控制器的控制器中,您将需要添加以下功能,打印是可选的,但很有用,因此您可以看到发生了什么。
// 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)
真的很简单也很好:).
第一种情况:当你想select其他tab索引时
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)
}
}