gpt4 book ai didi

ios - 带有 UIControlState 的 performSelector

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

在一段代码中,我想动态地在 UIButton 上触发一个方法,我想执行提供了 UIControlState 的方法。

比如我现在的代码是:

private func setValue(value: AnyObject, forKey: String, forState: UIControlState) {

let methodName = "set" + forKey.capitalizedString + ":forState:"
let sel = Selector(methodName)

if self.respondsToSelector(sel) {
self.performSelector(sel, withObject: value, withObject: forState.rawValue)
}
}

在此示例中,forKey 包含TitleforState 包含UIControlState.Normalvalue 只是一个简单的字符串,但被定义为 AnyObject。它接受 AnyObject,因为还有一些方法需要 UIImage 等。

self 在这个例子中是一个 UIButton

UIButton 确实响应我创建的Selector(定义为setTitle:forState:) ,它会在没有任何警告的情况下触发 performSelector 方法,但此 UIButton 的标题仍未更新。

问题可能出在 value 对象形式 AnyObjectString 的转换中,或者在 forState 的转换中 对象,但我不确定如何以通用方式解决此问题。

这是在 Swift 2 中执行此操作的正确方法吗?还是有人发现了我的理论中的一个简单错误?

最佳答案

经过一番摸索,我找到了解决方案。我注意到 methodForSelector 方法并发现使用 IMP 是解决我的问题的方法。

private func setValue(value: AnyObject, forKey key: String, forState state: UIControlState) {

let methodName = "set" + key.capitalizedString + ":forState:"
let sel = Selector(methodName)

if self.respondsToSelector(sel) {
typealias setValueForControlStateIMP = @convention(c) (UIView, Selector, AnyObject, UIControlState) -> Void

let methodSignature = self.methodForSelector(sel)

let callback = unsafeBitCast(methodSignature, setValueForControlStateIMP.self)
callback(self, sel, value, state)
}

}

关于ios - 带有 UIControlState 的 performSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704595/

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