【问题标题】:How to identify the viewController a button has been added onto?如何识别已添加按钮的 viewController?
【发布时间】:2018-11-11 23:35:11
【问题描述】:

我想知道点击按钮时视图控制器的名称是什么。我已经查看了here 提供的答案。但我相信如果我在屏幕上有不同的 containerViews 将无法工作......每个按钮的 viewController 可能不同。因此我需要一个不同的解决方案。

所以我编写了这个函数来递归查找直到找到UIViewController

extension UIView{
    func getTypeOfMyViewController() -> UIViewController.Type?{
        if let _super = superview as? UIViewController{ // logically wrong!
            return type(of:_super)
        }else if let _super = superview{
            return _super.getTypeOfMyViewController()
        }else{
            assertionFailure("everything should end up being on some viewController")
            return nil
        }
    }
}

唯一的问题是这一行:

if let _super = superview as? UIViewController{

它给了我以下警告:

从“UIView”投射?到不相关的类型 'UIViewController' 总是失败

superviewUIView,我不知道如何提取包含“视图”的 “viewController”

问题1:那我该怎么做呢?

另外我想像这样使用getTypeOfMyViewController 函数:

extension UIButton{
    open override var accessibilityLabel: String?{
        get {
            return "\(getTypeOfMyViewController.self): \(titleLabel?.text ?? "Null")"
        }
        set{
            // nothing particular
        }
    }
}

我这样做是因为我想为我的日志记录系统中的所有按钮点击创建一个唯一标识符。

问题 2: Swift 是否提供更简单的解决方案?

【问题讨论】:

  • 你可能会沿着响应者链往上走,直到你碰到一个视图控制器。不确定这是否适用于 100% 的情况。
  • @MartinR 谢谢。我的assertionFailure 有意义吗?我的意思是有没有什么东西不会出现在 viewController 上?
  • @Honey extension UIView { var viewController: UIViewController? { return next as? UIViewController ?? (next as? UIView)?.viewController } }

标签: ios swift logging uiviewcontroller uibutton


【解决方案1】:

视图控制器不是视图,因此它永远不可能是超级视图。你有正确的想法,但你正在寻找错误的层次结构。您想要的不是视图层次结构,而是 响应者链

沿着响应链向上走,直到到达视图控制器:

var r : UIResponder = theButton
repeat { r = r.next! } while !(r is UIViewController)
let vc = r as! UIViewController

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多