swift - 如何在 Swift 的自定义类中创建 UIButton 操作

标签 swift uibutton action target

我想创建一个类来添加 UIButton Action ,然后 viewcontroller 可以调用这个类来创建 Action 。

但是错误消息告诉我“无法识别的选择器发送到实例”

我该如何修复它们?

class MYController: UIViewController{
    @IBOutlet weak var pptMode: UIButton!
    @IBOutlet weak var videoMode: UIButton!
    @IBOutlet weak var meetingMode: UIButton!
    @IBOutlet weak var videoMeeting: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()

        ModeChange().modeChangeUtil(self,pptMode:pptMode, videoMode: videoMode, meetingMode: meetingMode, videoMeeting: videoMeeting)

    }
}


class ModeChange {

    func modeChangeUtil(vc:UIViewController,pptMode:UIButton,videoMode:UIButton,meetingMode:UIButton,videoMeeting:UIButton){
        pptMode.addTarget(vc, action: "modeTouched:", forControlEvents:UIControlEvents.TouchUpInside)
        pptMode.tag = modeButtonTag.ppt.rawValue

        videoMode.addTarget(vc, action: "modeTouched:", forControlEvents:UIControlEvents.TouchUpInside)
        videoMode.tag = modeButtonTag.video.rawValue
        meetingMode.addTarget(vc, action: "modeTouched:", forControlEvents:UIControlEvents.TouchUpInside)
        meetingMode.tag = modeButtonTag.meeting.rawValue
        videoMeeting.addTarget(vc, action:"modeTouched:", forControlEvents:UIControlEvents.TouchUpInside)
        videoMeeting.tag = modeButtonTag.videoMeeting.rawValue


    }
    enum modeButtonTag: Int {
        case ppt
        case video
        case meeting
        case videoMeeting
    }
   func modeTouched(sender:UIButton){
        let modeCmd:ModeCommand = ModeCommand(device: Mode(onoffUrl: OfficeConstants.MeetingRoom3A.MODE))
        switch sender.tag {
        case modeButtonTag.ppt.rawValue:
            modeCmd.modeStatus = .PPT

        case modeButtonTag.video.rawValue:
            modeCmd.modeStatus = .Video
        case modeButtonTag.meeting.rawValue:
            modeCmd.modeStatus = .Meeting
        case modeButtonTag.videoMeeting.rawValue:
            modeCmd.modeStatus = .VideoMeeting
        default: break
            //do nothing
        }
        modeCmd.execute()
    }
}

最佳答案

您传递了错误的参数!

addTarget 方法有 3 个参数:

  1. target 是选择器将发送到的实例。
  2. action 是一个选择器
  3. forControlEvents 是你要处理的事件

解释完这些,你能找出你代码中哪个参数有问题吗?

这是目标!

由于选择器将被发送到 target,因此 target 必须有一个名为 modeTouched: 的方法。

在您的方法调用中,您传入了 vc 作为 target。这意味着选择器 modeTouched: 必须发送到 vc。但是,您没有在 vc 中定义 modeTouched: 方法!这就是错误发生的原因。

我猜您想将选择器发送到 ModeChange 类中的 modeTouched: 方法。因此,目标应该是 self:

pptMode.addTarget(self, action: #selector(modeTouched:), forControlEvents:UIControlEvents.TouchUpInside)

这应该可以解决问题!

关于swift - 如何在 Swift 的自定义类中创建 UIButton 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496985/

相关文章:

java - 如何从 Openwhisk Java Action 内部读取文件

ios - UICollectionViewCell 未显示

ios - 快速:单击按钮时继续

ios - 我们可以让 iOS 应用向后兼容吗

ios - Swift:是否可以从堆栈中删除 View Controller?

iOS:将 Exclusive Touch 设置为 View 中的所有按钮

ios - UIButton 的框架大小何时最终设置

asp.net-mvc - ASP.Net MVC 和状态 - 如何在请求之间保持状态

swift - 创建自定义按钮形状 Swift 4

java - 如何使一些 Action 依赖于另一个 Action 的完成?