我正在研究漫画阅读器。我想拥有一个对数据一无所知的视图,它是愚蠢的,并且使用委托。我希望视图控制器使用该视图并将其绑定到数据。控制器将遵守协议。这是我的尝试。
这是我的协议:
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
}()
...
}
问题:
"Argument of '#selector' refers to instance method 'handleMostRecentClicked()' that is not exposed to Objective-C"
。@objc
之前添加protocol ComicViewDelegate
,则当我尝试传递参数时,我的handleSelectedComicNumber
方法也会获得"Argument of '#selector' does not refer to an '@objc' method, property, or initializer"
。XKCDComic
是Decodable
的结构,所以我不能使其成为NSObject 关于此的任何提示吗?
答案 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()
}