首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从UIViewController在UIView中快速调用组件

从UIViewController在UIView中快速调用组件
EN

Stack Overflow用户
提问于 2016-08-24 19:26:38
回答 2查看 1.2K关注 0票数 1

我有一个问题,我在一个UIViewController类中有一个UIViewController,我想在一个发生在另一个文件中的UIView类中的动画之后启用这个按钮。

代码语言:javascript
运行
复制
class MainViewController: UIViewController {
    @IBOutlet weak var nextButton: UIButton! 

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

动画完成后,当我试图从nextButton类调用viewController时,会得到以下错误:

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

我在将nextButton启用设置为true的行上得到了错误。

代码语言:javascript
运行
复制
class CustomView: UIView {
    var vc = MainViewController()

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-24 19:38:02

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

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

代码语言:javascript
运行
复制
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)
    }
}

在这个实现中,控制器是视图委托,当视图中发生有趣的事件时(比如特定的动画结尾),控制器会得到通知。

票数 0
EN

Stack Overflow用户

发布于 2016-08-24 19:33:49

在您的UIView中设置一个委托,它可以告诉您什么时候应该

代码语言:javascript
运行
复制
protocol CustomViewDelegate {
    func pushThatButton()
}

在CustomView类中,如下所示:

代码语言:javascript
运行
复制
weak var delegate: CustomViewDelegate?

然后

代码语言:javascript
运行
复制
func animationEnded() {
    delegate.pushThatButton()
}

在UIViewController中

代码语言:javascript
运行
复制
class MainViewController: UIViewController, CustomViewDelegate {

并实现委托ofc

代码语言:javascript
运行
复制
func pushThatButton()
    nextButton.sendActionsForControlEvents(.TouchUpInside)
}

几乎忘记了,在viewController和安装委托中对您的视图做一个输出!在viewDidLoad()中或者什么时候您会发现这是最好的

代码语言:javascript
运行
复制
customViewOutlet.delegate = self
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39131547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档