【问题标题】:Swift Call component from UIViewController in a UIView [duplicate]UIView中UIViewController的Swift Call组件[重复]
【发布时间】:2023-03-22 02:14:01
【问题描述】:

我遇到了问题,我在 UIViewController 类中有一个 UIButton,我想在另一个文件中的 UIView 类中发生动画后启用该按钮。

class MainViewController: UIViewController {
    @IBOutlet weak var nextButton: UIButton! 

    @IBAction func nextButtonPressed(sender: UIButton) {
        nextButton.enable = false
    }
}

当我在动画完成后尝试从viewController 类调用nextButton 时,出现此错误:

EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码 = 0x0)

我在将 nextButton enable 设置为 true 的那一行出现错误。

class CustomView: UIView {
    var vc = MainViewController()

    func animationEnded() {
        vc.nextButton = true
    }
}

我不知道我错过了什么,我希望能得到一些帮助。谢谢

【问题讨论】:

  • 什么是完整的、人类可读的错误信息?究竟是哪一行导致了错误?
  • 致命错误:在展开可选值时意外发现 nil。我在 animationEnded 函数中得到错误
  • maddy:这确实是一个更深层次的问题,值得单独回答,关于跨不同 VC 的沟通
  • @GiorgioDoganiero 他们不喜欢你的提问方式。而是问一个标题更好的新问题:“如何在自定义 UIView 的单独文件中向 UIViewController 发送消息?”您的错误与问题无关。删除您的错误代码和错误消息,这显然会使其中一位版主错误地关闭此问题,或者表明您理解所有 @IBOutlets 在您的错误方法中都无法使用(nil)。

标签: ios iphone swift uiview uiviewcontroller


【解决方案1】:

在你的 UIView 中创建一个委托,告诉它何时应该发生

protocol CustomViewDelegate {
    func pushThatButton()
}

在 CustomView 类中放这个:

weak var delegate: CustomViewDelegate?

然后

func animationEnded() {
    delegate.pushThatButton()
}

在 UIViewController 中

class MainViewController: UIViewController, CustomViewDelegate {

并实现c的委托

func pushThatButton()
    nextButton.sendActionsForControlEvents(.TouchUpInside)
}

几乎忘记了,在 viewController 中为您的视图创建一个出口并设置委托!在 viewDidLoad() 或者什么时候你会发现这个最好

customViewOutlet.delegate = self

【讨论】:

    【解决方案2】:

    您遇到错误是因为在您的CustomView 中创建了一个新的MainViewController,您没有使用从情节提要中初始化的那个。新的MainViewController 没有初始化任何属性,所以nextButton 为零,因此当您尝试访问它时会崩溃。

    您要做的是从视图通知您的控制器动画已经结束,以便控制器可以更新按钮(因为控制器拥有该按钮)。在 Cocoa 中执行此操作的标准方法是使用委托模式,如下所示:

    class MainViewController: UIViewController, CustomViewDelegate
    {
        @IBOutlet weak var nextButton: UIButton!
        @IBOutlet weak var customView: CustomView!
    
        @IBAction func nextButtonPressed(sender: UIButton) {
            self.nextButton.enabled = false
        }
    
        override func awakeFromNib() {
            super.awakeFromNib()
            self.customView.delegate = self
        }
    
        func customViewAnimationDidEnd(customView: CustomView) {
            self.nextButton.enabled = true
        }
    }
    
    protocol CustomViewDelegate : class
    {
        func customViewAnimationDidEnd(customView: CustomView)
    }
    
    class CustomView: UIView
    {
        weak var delegate: CustomViewDelegate? = nil
    
        func animationEnded() {
            self.delegate?.customViewAnimationDidEnd(self)
        }
    }
    

    在这个实现中,控制器是视图代理,当视图中发生有趣的事件(例如特定的动画结束)时会收到通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      相关资源
      最近更新 更多