gpt4 book ai didi

ios - 如何在 swift 中将 touchUpInside 函数作为参数传递?

转载 作者:行者123 更新时间:2023-11-28 10:10:44 25 4
gpt4 key购买 nike

我创建了一个动态的 UIButton,我想为该按钮动态设置监听器。但是我得到错误:

Use of unresolved identifier 'myFuncName(sender:)'

我的代码(您可以将其粘贴到 Xcode 中并运行):

import UIKit

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

// add my button
let button = Btn()
button.setListener(buttonTapped)
view.addSubview(button)
}

@objc func buttonTapped() {
print("tapped")
}
}

// -------------------------------
class Btn: UIControl {
fileprivate let button: UIButton = {
let swapButton = UIButton()
let size = CGFloat(50)
swapButton.frame.size = CGSize(width: size, height: size)
swapButton.backgroundColor = UIColor.green

return swapButton
}()

override init(frame: CGRect) {
super.init(frame: frame)
addSubview(button)
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
addSubview(button)
}

func setListener(_ listener: @escaping () -> Void) {
// Error - Use of unresolved identifier 'listener(sender:)'
button.addTarget(self, action: #selector(listener(sender:)), for: .touchUpInside)
}
}

最佳答案

#selector 创建一个指向函数的 Selector。如果您想调用自定义监听器代码块,您需要将其分配给 Btn 的实例变量,然后从私有(private)函数中调用它。

let button = Btn()
button.listener = {
// your closure here
}

class Btn: UIControl {
weak var listener: (() -> Void)?

override init(frame: CGRect) {
super.init(frame: frame)
addSubview(button)
button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)
}

@objc private func buttonTapped(_ sender: UIButton) {
self.listener?()
}
}

关于ios - 如何在 swift 中将 touchUpInside 函数作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48492518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com