【发布时间】:2020-05-29 18:58:07
【问题描述】:
我有一个应用程序,其中包含两个故事板、一个标签栏控制器和 6 个以上嵌入在它们自己的导航控制器中的视图控制器。
我从所有 VC 中的 barButtonItem 模态地呈现 CartViewController,并从 tableViewCell 中呈现 CustomersVC。我的问题是,当我从购物车中展示客户时,我可以再次从 CustomersVC 转到购物车,然后继续循环......
假设
我的假设是,如果我从 anyVC 模态显示 Cart,然后从 cart 模态显示一个 navigationController,然后再显示 CustomersVC,这样的数组就会存在:
- 任何视图控制器
- CartViewController
- CustomersNavigationController
- 客户视图控制器
为了解决这个问题,我正在尝试从 customersVC 中删除“ViewCart”barButtonItem,如果它是从购物车中调用的。我的问题是我无法遍历堆栈来检查它。我已经尝试了在 SO 找到的几种方法,但都没有。
我知道我可以使用委托并设置变量来显示/隐藏按钮,但我渴望学习并且希望它更强大,而不必记住手动设置和重置 var。
有什么建议吗?
代码
extension UIViewController {
@objc func viewCart() {
if Cart.sharedInstance.order.items.count != 0 {
let storyboard = UIStoryboard(name: "Cart", bundle: nil)
if let cartVC = storyboard.instantiateViewController(withIdentifier: "Cart") as? CartViewController {
let cartNavigationController = UINavigationController(rootViewController: cartVC)
self.present(cartNavigationController, animated: true)
}
}
}
}
Class CartViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let customersNC = storyboard.instantiateViewController(withIdentifier: "CustomersNC") as? UINavigationController {
present(customersNC, animated: true)
}
class CustomersTableViewController {
override func viewDidLoad() {
// Tried presentingViewController:
if let CartVC = presentingViewController as? CartViewController {
myButton.isEnabled = false
}
// Tried navigationController?.viewControllers:
guard let controllersInStack = navigationController?.viewControllers else { return }
if let CartVC controllersInStack.first(where: { $0 is CartViewController }) as? CartViewController {
myButton.isEnabled = false
}
// Tried an extension I found here https://stackoverflow.com/questions/38583941/get-all-list-of-uiviewcontrollers-in-ios-swift, but it returns nil
extension UIViewController {
/**
* Traverses the entire VC hirearchy downwards and collects VC'w that are of speccific PARAM: type
* - Fixme: ⚠️️ this can be written more elegantly with flatMap
* ## Example:
* let vc: CustomVC? = UIApplication.shared.delegate?.window?.rootViewController?.descendants().first
*/
func descendants<T>(type: T.Type? = nil) -> [T] {
var childrenOfType: [T] = []
self.children.forEach {
if let child: T = ($0 as? T) {
childrenOfType.append(child)
}
if !$0.children.isEmpty {
childrenOfType += $0.descendants(type: type)
}
}
return childrenOfType
}
}
【问题讨论】:
-
没有这样的数组,所以你的假设是错误的。与其做出错误的假设,不如专注于问题的现实。从您目前所说的来看,听起来只要问一下是否有
navigationController就足够了。但是,如果您能画出更好的情况图,即显示 整个 视图控制器层次结构,当您希望能够说“ go no deep”,每一步都提供完整信息,说明我们为到达这里所做的工作(孩子、推送或礼物)。