【问题标题】:How to get instance of view controller in UIButton class which is instantiated from storyboard如何在从情节提要实例化的 UIButton 类中获取视图控制器的实例
【发布时间】:2019-07-11 05:54:24
【问题描述】:

我正在尝试从框架中的UIButton 类访问viewController 的实例。每当button 从情节提要中实例化时,init? (coder aDecoder: NSCoder) 就会被调用。但我无法理解如何从中访问`viewController。

我在UIButton 类中有一个自定义初始化方法init(viewController: UIViewController),当button 以编程方式实例化时,它给了我viewController

例如。 let button = CustomButton(viewController: self)

但是现在我想在button 被故事板初始化时得到这个viewController 实例,即在init? (coder aDecoder: NSCoder) 调用时。

到目前为止,我正在使用这个来获取viewController 对象,

button.viewController = self

但我认为这不是获取东西的好习惯。我需要另一种方式。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 这不是从按钮访问视图控制器的好习惯,你应该这样做
  • @Lu_ 我知道并且我提到了这一点。这就是为什么我正在寻找另一种方法。你能帮忙吗?
  • 就像我说的,从视图控制器访问按钮而不是从按钮控制器,你将有 IBOutlet 使用
  • 我希望这个视图控制器对象在点击按钮时导航屏幕。由于此按钮在框架中,因此没有其他方法可以在没有视图控制器对象的情况下推送屏幕。
  • 您可以使用委托,按钮可以在框架中,这并不意味着您不能拥有任何IBOutlet

标签: ios swift uibutton


【解决方案1】:

我认为您可以使用此代码:

extension UIView {
    func findViewController() -> UIViewController? {
        if let nextResponder = self.next as? UIViewController {
            return nextResponder
        } else if let nextResponder = self.next as? UIView {
            return nextResponder.findViewController()
        } else {
            return nil
        }
    }
}

但总的来说,您应该考虑为什么需要它以及是否有其他方法可以做到这一点。例如,您可以将一个委托传递给负责此导航的按钮。

【讨论】:

    【解决方案2】:

    该属性用于获取任意 UIView 的 ParentViewController(UIViewController)。

    extension UIResponder {  
    
    var viewController:UIViewController? {
    
        if self.next is UIViewController {
            return self.next as? UIViewController
        } else {
            guard self.next != nil else { return nil }
            return self.next?.viewController
        }
    }
    

    }

    【讨论】:

    • 我正在尝试在框架中获取 viewController。使用您的解决方案,我在框架中一无所获。
    【解决方案3】:

    最后,在我的朋友“Pankaj Bawane”的帮助下,我得到了这个可行的解决方案。

    extension UIView {
        var parentViewController: UIViewController? {
            var parentResponder: UIResponder? = self
            while parentResponder != nil {
                parentResponder = parentResponder!.next
                if let viewController = parentResponder as? UIViewController {
                    return viewController
                }
            }
            return nil
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2017-03-29
      • 2020-02-06
      • 1970-01-01
      • 2013-03-03
      • 2015-10-20
      相关资源
      最近更新 更多