【发布时间】: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