gpt4 book ai didi

ios - 在swift中传递闭包作为函数中选择器使用的参数

转载 作者:行者123 更新时间:2023-11-28 12:27:52 27 4
gpt4 key购买 nike

我正在尝试创建一个通用按钮创建函数,我将一个闭包传递到该函数中,该闭包表示单击按钮后产生的操作。我的代码如下。但是,我收到以下错误: #selector 的参数不能引用属性。有什么解决方法的建议吗?我不想编写单独的函数,除了目标操作之外,其他所有内容都相同。

 func myButton(textColor tColor:UIColor , title:String, 
_ buttonFcn: (UIButton) -> Void,
titleSize:CGFloat=30) -> UIButton {
let newButton = UIButton(type: .System)
let bgColor = UIColor(red:204/255, green:204/255, blue:204/255, alpha:1.0)
newButton.backgroundColor = bgColor

newButton.setTitle(title, forState: .Normal)
newButton.setTitleColor(tColor, forState: .Normal)

newButton.titleLabel?.font = newButton.titleLabel?.font.fontWithSize(titleSize)


newButton.addTarget(self, action:#selector(buttonFcn),
forControlEvents:
UIControlEvents.TouchUpInside)

return newButton
}

最佳答案

问题在于目标- Action 机制是一种 Objective-C 机制,因此它基于 Action 选择器是对象方法这一概念.因此,您需要有一些基于 NSObject 的对象,它具有此功能作为方法,然后可以用作目标。

因此,如果在每种情况下不同的是目标和操作,您需要传递的是对目标的引用以及选择器字符串。 Swift 会对此提示,但如果您知道如何正确地形成一个选择器字符串,您当然可以摆脱它;您将无法使用 #selector 语法,因此如果您错误地形成选择器字符串,您将面临崩溃的风险。但这是我们在旧的 Objective-C 时代一直在做的事情,所以如果这是您的目标,那就继续吧。

完全人为但有效的例子:

func buttonMaker(target:NSObject, selectorString:String) -> UIButton {
let b = UIButton(type:.system)
b.setTitle("Testing", for: .normal)
b.addTarget(target, action: Selector(selectorString), for: .touchUpInside)
b.sizeToFit()
return b
}

下面是如何从 View Controller 调用它:

func doButton(_ sender:Any) {
print("ha!")
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let b = buttonMaker(target:self, selectorString:"doButton:")
b.frame.origin = CGPoint(x:100, y:100)
self.view.addSubview(b)
}

当我们点击按钮时,我们不会崩溃(而是打印“ha”),因为我知道如何正确制作选择器字符串。但是,正如您所看到的,为了实现这一点,我不得不完全放弃使用 #selector,因此安全性不高。如果我写错了选择器字符串——例如,如果我拼错了,或者省略了冒号——我们就会在点击按钮时崩溃,就像我们在 Swift #selector< 之前一直做的那样 和 Objective-C @selector 被发明了。

关于ios - 在swift中传递闭包作为函数中选择器使用的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42895332/

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