所以这是我的情景。我正在举杯祝酒。 toast视图接受一个选择器,它将其设置为toast视图内按钮的目标操作。但是我得到了无法识别的选择器错误。
// MainViewController.swift
func viewDidLoad() {
// Custom initializer for toastview
let toastView = ToastView(view: nil, selector: #selector(testSelector))
.
.
.
}
@objc func testSelector() {
print("Test")
}
// ToastView.swift
var selector: Selector
convenience init(view: UIView, selector: Selector) {
self.selector = selector
let button = UIButton(type: .system)
button.addTarget(self, action: self.selector, for: .touchUpInside)
}
编辑:稍微更改了代码以反映原始代码中的实际内容。
答案 0 :(得分:2)
你的目标错了。 Target必须是类的对象,其中定义了选择器(方法或函数)。如果在$studPerInfo = explode(',', $_GET['studRegInfo']);
目标中定义了函数,则必须是MainViewController
的对象。如果MainViewController
选择器中定义的函数必须是ToastView
的对象,则相同。
您可以在ToastView
课程中移动testSelector
功能并保持休息状态。
选项1
ToastView
选项2
或者您将目标作为// something like this
class ToastView {
@objc func testSelector() {
print("Test")
}
}
参数传递。
init
并在// ToastView.swift
convenience init(view: UIView, target:Any, selector: Selector) {
let button = UIButton(type: .system)
button.addTarget(target, action: selector, for: .touchUpInside)
}
中称之为。
MainViewController
答案 1 :(得分:1)
如果要在testSelector
课程中执行操作,则应将ToastView
移至ToastView
课程。
如果要在MainViewController
中执行操作,请使用自定义委托。
或在button
类中全局声明ToastView
变量。然后,您可以使用
MainViewController
中添加目标
let toastView = ToastView()
toastView.button.addTarget(target, action: selector, for: .touchUpInside)
或强>
您可以使用闭包来执行按钮操作而不是选择器
class ToastView: UIView {
let button = UIButton()
var btnAction:((Void) -> Void)?
convenience init(_ btnAction: @escaping (Void) -> Void) {
self.init()
self.btnAction = btnAction
}
private init() {
super.init(frame: .zero)
button.addTarget(self, action: #selector(callbackButton(_:)), for: .touchUpInside)
}
func callbackButton(_ id:Any) -> Void {
if self.btnAction != nil {
self.btnAction!()
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
在MainViewController.swift中
func viewDidLoad() {
// Custom initializer for toastview
let toastView = ToastView.init( {(Void) -> Void in
print("test")
})
}
答案 2 :(得分:-1)
不要传入选择器,而是根本不需要传递选择器。 按下按钮时触发通知,并向Controller发送通知观察者。在随观察者附加的选择器中执行您想要的任何操作