Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将组件中按下的按钮的操作转到viewcontroller_Swift_Uiviewcontroller_Custom Controls - Fatal编程技术网

Swift 如何将组件中按下的按钮的操作转到viewcontroller

Swift 如何将组件中按下的按钮的操作转到viewcontroller,swift,uiviewcontroller,custom-controls,Swift,Uiviewcontroller,Custom Controls,我制作了一个UIView组件,里面有两个按钮。当用户触摸按钮时,我需要调用ViewController的动作方法 我试图传递选择器,但它崩溃了: 在ViewController上 component.leftAction = #selector(ViewController.myAction) func myAction(sender: UIButton!) { print("tapped!") } 关于斯威夫特 public var leftAction: Selector? {

我制作了一个UIView组件,里面有两个按钮。当用户触摸按钮时,我需要调用ViewController的动作方法

我试图传递选择器,但它崩溃了:

在ViewController上

component.leftAction = #selector(ViewController.myAction)

func myAction(sender: UIButton!) {
    print("tapped!")
}
关于斯威夫特

public var leftAction: Selector? {
    didSet {
        if (leftAction != nil){
            self.leftButton.addTarget(self, action: leftAction!, for: .touchUpInside)
        }
    }
}

我该怎么做?

更好的方法是与学员一起处理此问题。
要了解更多关于委派的信息,您可以

更好的方法是与学员一起处理此问题。 要了解更多关于委派的信息,您可以

改变一下

component.leftAction = #selector(ViewController.myAction)

ViewController
不应解除分配。

只需更改即可

component.leftAction = #selector(ViewController.myAction)


ViewController
不应解除分配。

它崩溃了,因为按钮目标错误。在您的例子中,您将目标作为
self
传递,它是
组件
类的一个实例。目标必须是
ViewController
实例,因为选择器是在
ViewController
类中定义的

你可以这样做来解决你的问题

public var leftTargetAction: (Any, Selector)? {
    didSet {
        if let targetAction = leftTargetAction {
            self.leftButton.addTarget(targetAction.0, action: targetAction.1, for: .touchUpInside)
        }
    }
}    
像这样使用它

component.leftTargetAction = (self,#selector(ViewController.myAction))

它崩溃了,因为按钮目标错了。在您的例子中,您将目标作为
self
传递,它是
组件
类的一个实例。目标必须是
ViewController
实例,因为选择器是在
ViewController
类中定义的

你可以这样做来解决你的问题

public var leftTargetAction: (Any, Selector)? {
    didSet {
        if let targetAction = leftTargetAction {
            self.leftButton.addTarget(targetAction.0, action: targetAction.1, for: .touchUpInside)
        }
    }
}    
像这样使用它

component.leftTargetAction = (self,#selector(ViewController.myAction))

您使用的是什么Swift版本?在Swift3中,选择器语法已更改。它需要是选择器(ViewController.myAction)@DávidPászor反正它崩溃了:“无法识别的选择器发送到实例”为什么不直接将目标添加到按钮而不是通过选择器变量传递呢?选择器(myAction)呢?您确定您的类名为
ViewController
?您使用的是什么Swift版本?在Swift3中,选择器语法已更改。它需要是选择器(ViewController.myAction)@DávidPászor反正它崩溃了:“无法识别的选择器发送到实例”为什么不直接将目标添加到按钮而不是通过选择器变量传递呢?选择器(myAction)呢?您确定您的类被称为
ViewController