- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 tabBar,其中有一个选项卡,其中包含一个 NavVC,该 NavVC 的根作为 ParentVC。 ParentVC 有一个管理两个子VC(RedVC 和BlueVC)的segmentedControl。 RedVC 和 BlueVC 都包含一个按下 YellowVC 的按钮。
问题是当 YellowVC 被推送时,在它的 viewDidLoad 中我检查堆栈上的 View Controller ,出现的两个 Controller 是 ParentVC 和 YellowVC,没有提到 RedVC (如果它会插入它)或 BlueVC (如果它会插入它)。
for controller in navigationController!.viewControllers {
print(controller.description) // will only print ParentVC and YellowVC
}
我知道,由于 tabBar 有一个 navVC 作为选项卡,并且它的根是 ParentVC,那么这就是推送的根,但我需要知道当 YellowVC 被推送时,RedVC 或 BlueVC 中的哪一个触发了它。
我可以在 YellowVC 中使用一些类属性,但我想看看是否有通过 navigationController 的另一种方法:
var pushedFromRedVC = false // I'd prefer not to use these if I don't have to
var pushedFromBlueVC = false
当 RedVC 或 BlueVC 推送 YellowVC 时,我如何获得对 RedVC 或 BlueVC 的引用?
class MyTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let parentVC = ParentVC()
let navVC = UINavigationController(rootViewController: parentVC)
navVC.tabBarItem = UITabBarItem(title: "Parent", image: nil), tag: 0)
viewControllers = [navVC]
}
}
class ParentVC: UIViewController {
var segmentedControl: UISegmentedControl! // switching segments will show either the redVC or the blueVC
let redVC = RedController()
let blueVC = BlueController()
override func viewDidLoad() {
super.viewDidLoad()
addChildViewController(redVC)
view.addSubview(redVC.view)
redVC.didMove(toParentViewController: self)
addChildViewController(blueVC)
view.addSubview(blueVC.view)
blueVC.didMove(toParentViewController: self)
}
}
class RedVC: UIViewController {
@IBAction func pushYellowVC(sender: UIButton) {
let yellowVC = YellowVC()
yellowVC.pushedFromRedVC = true // I'd rather not rely on this
navigationController?.pushViewController(yellowVC, animated: true)
}
}
class BlueVC: UIViewController {
@IBAction func pushYellowVC(sender: UIButton) {
let yellowVC = YellowVC()
yellowVC.pushedFromBlueVC = true // I'd rather not rely on this
navigationController?.pushViewController(yellowVC, animated: true)
}
}
class YellowVC: UIViewController {
var pushedFromRedVC = false // only sample, I'd rather not use these if I don't have to
var pushedFromBlueVC = false
override func viewDidLoad() {
super.viewDidLoad()
for controller in navigationController!.viewControllers {
// even though the push is triggered from either the RedVC or BlueVC it will only print ParentVC and YellowVC
print(controller.description)
}
}
}
最佳答案
由于 RedVC
和 BlueVC
包含在 ParentVC
中,因此您不会在 UINavigationController
中找到对它们的任何引用> 堆栈。
使用两个 bool 值的替代方法是使用 sourceVC
属性:
class YellowVC: UIViewController {
var sourceVC: UIViewController?
override func viewDidLoad() {
super.viewDidLoad()
if self.sourceVC is BlueVC {
print("We came from Blue")
} else if self.sourceVC is RedVC {
print("We came from Red")
} else {
print("We came from somewhere else"
}
}
}
class RedVC: UIViewController {
@IBAction func pushYellowVC(sender: UIButton) {
let yellowVC = YellowVC()
yellowVC.sourceVC = self
navigationController?.pushViewController(yellowVC, animated: true)
}
}
class BlueVC: UIViewController {
@IBAction func pushYellowVC(sender: UIButton) {
let yellowVC = YellowVC()
yellowVC.sourceVC = self
navigationController?.pushViewController(yellowVC, animated: true)
}
}
您可能需要考虑 YellowVC
是否需要调用 Red/BlueVC
上的某些方法,或者只需要知道红/蓝源隐含的某些状态。
如果是后者,那么 RedVC
和 BlueVC
可能应该使用委托(delegate)模式来让 ParentVC
知道它应该推送 YellowVC
并根据委托(delegate)调用的来源设置适当的状态属性。
您还可以考虑将状态放入模型中,然后传递给 VC,而不是 VC 本身的离散属性。
关于iOS - 在父级插入 AnotherVC 后如何在 NavigationController 堆栈中找到 ChildVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53139276/
我有 Storyboard: 如您所见,我有带容器的 MenuViewController : UIViewController。容器是MenuTableViewController : UITabl
最新的 Swift/XCode/iOS。 好的,我正在尝试在容器 View 中更换子 VC。我读过几篇描述如何做到这一点的帖子,它们非常有帮助。但是,我似乎遇到了一个我可以解决的限制问题。 我有一个包
我有一个 tabBar,其中有一个选项卡,其中包含一个 NavVC,该 NavVC 的根作为 ParentVC。 ParentVC 有一个管理两个子VC(RedVC 和BlueVC)的segmente
好吧,我对此是全新的,并且在阅读许多教程和文章时有点不知所措。并花了几个小时来解决类似的问题,但没有运气解决我自己的问题。我有一个“AddSiteVC”,允许用户添加或删除放入 CoreData 的项
我在做一件相当简单的事情时遇到了一些困难,我遗漏了一些东西但没有看到...... 我用一个非常简单的应用程序(使用 IB)重现了这个问题: 应用的主要 ViewController 是一个 UINav
我是一名优秀的程序员,十分优秀!