iOS / Swift:尝试将协议方法添加到UIView的按钮时,告诉我我的方法未暴露于目标C

时间:2018-07-25 21:41:08

标签: ios swift

我正在研究漫画阅读器。我想拥有一个对数据一无所知的视图,它是愚蠢的,并且使用委托。我希望视图控制器使用该视图并将其绑定到数据。控制器将遵守协议。这是我的尝试。

这是我的协议:

import Foundation

protocol ComicViewDelegate {
    var comic: XKCDComic? {get set}
    func handleMostRecentClicked()
    func handlePrevClicked()
    func handleNextClicked()
    func handleRandomClicked()
    func handleSelectedComicNumber(of number: Int)
}

这是我的观点:

class ComicView: UIView {

    var delegate: ComicViewDelegate?

    public lazy var view = UIView()

    public lazy var mostRecentButton: UIButton = {
        let button = UIButton()
        button.addTarget(self, action: #selector(delegate?.handleMostRecentClicked), for: .touchUpInside)

        view.addSubview(button)
        return button
    }()

    ...
}

问题:

  1. 所有方法我都得到"Argument of '#selector' refers to instance method 'handleMostRecentClicked()' that is not exposed to Objective-C"
  2. 如果我在@objc之前添加protocol ComicViewDelegate,则当我尝试传递参数时,我的handleSelectedComicNumber方法也会获得"Argument of '#selector' does not refer to an '@objc' method, property, or initializer"
  3. XKCDComicDecodable的结构,所以我不能使其成为NSObject

关于此的任何提示吗?

1 个答案:

答案 0 :(得分:1)

问题出在这里(按钮事件在作为视图实例的目标内部搜索选择器,因此应在其中编写方法)

button.addTarget(self, action: #selector(delegate?.handleMostRecentClicked), for: .touchUpInside)

更改为

button.addTarget(self, action: #selector(self.handleMostRecentClicked(_:)), for: .touchUpInside)

//

 @objc func handleMostRecentClicked (_ sender:UIButton) {

  delegate?.handleMostRecentClicked()
}