【问题标题】:iOS: Get 'UIViewController' of 'UIButton'iOS:获取“UIButton”的“UIViewController”
【发布时间】:2020-01-22 15:06:12
【问题描述】:

我需要在UIButton 的子类中获取UIViewController 的引用(对象)。在这里我尝试了一些但失败了。

class NavigationBarButton: UIButton {


    override func didMoveToSuperview() {
        super.didMoveToSuperview()

        var viewController: UIViewController? {
            var nextResponder: UIResponder? = self
            repeat {
                nextResponder = nextResponder?.next

                if let viewController = nextResponder as? UIViewController {
                    return viewController
                }

            } while nextResponder != nil

            return nil
        }

        guard let vcViewController = self.viewController else { print("NavigationBarButton view controller could not found"); return }

        print("handle further operations with ViewController of Button")

    }

}

class FirstVC: UIViewController {

    @IBOutlet weak var myButton: NavigationBarButton?


}

结果:
找不到 NavigationBarButton 视图控制器

有没有其他方法,在不更新 UIViewController 的情况下,我可以在 UIButton 的子类中获取视图控制器引用。任何其他 UIButton 方法都可以在这里为我提供帮助,我可以在其中获取按钮的视图控制器。

类似的苏阙。但对这个问题没有用:Get current UIViewController from UIButton's class

【问题讨论】:

  • 为什么首先需要UIViewController 实例?按钮不应该知道它在哪个 VC 中。这似乎是一个糟糕的设计。
  • @Sweeper - 我需要在按钮类中编写一些通用代码(为视图控制器实现一些属性和操作),这需要视图控制器参考。
  • 这很容易崩溃,没有充分的理由做这样的事情。我还假设您正试图从UINavigationItem 内的按钮访问视图控制器,这甚至是一个更大的问题,因为该按钮将位于导航控制器内,而不是在您的控制器内。甚至没有谈论导航栏层次结构有点复杂的事实。也许访问view.window.rootVieController 并在children 中搜索您想要的控制器会更容易。无论如何,使用didMoveToWindow 而不是didMoveToSuperview 应该是第一步。
  • @Sulthan - 我没有使用默认导航栏或 UINavigationItem 类。它只是一个类似于 NavigationBarButton 的按钮类名称,但它扩展到 UIButton 并位于 UIViewController 内。

标签: ios swift uiviewcontroller uibutton


【解决方案1】:

这可能对你有用。

class NavigationBarButton: UIButton {


    override func didMoveToWindow() {
        super.didMoveToWindow()

        var viewController: UIViewController? {
            var nextResponder: UIResponder? = self
            repeat {
                nextResponder = nextResponder?.next

                if let viewController = nextResponder as? UIViewController {
                    return viewController
                }

            } while nextResponder != nil

            return nil
        }

        guard let vcViewController = self.viewController else { print("NavigationBarButton view controller could not found"); return }

        print("handle further operations with ViewController of Button")

    }

}

class FirstVC: UIViewController {

    @IBOutlet weak var myButton: NavigationBarButton?


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多