【问题标题】:Primitive type parameters in Swift Selector functionSwift Selector 函数中的原始类型参数
【发布时间】:2021-10-13 19:40:28
【问题描述】:

我想为我的 VC 添加动态数量的按钮。所以我正在循环我的按钮数组模型并实例化 UIButtons。问题在于向这些按钮添加目标。我想在添加目标时将一个字符串传递给选择器,但是 Xcode 编译器不允许我这样做

“#selector”的参数不引用“@objc”方法、属性或初始化程序

@objc func didTapOnButton(url: String) { }
let button = UIButton()
button.addTarget(self, action: #selector(didTapOnButton(url: "Random string which is different for every bbutton ")), for: .touchUpInside)

除了使用自定义 UIButton 之外还有其他解决方案吗

【问题讨论】:

  • 这能回答你的问题吗? Passing arguments to selector in Swift
  • 我认为您误解了选择器的工作原理。您没有传递带有某个值的参数,而是传递了函数的签名,其中可以包括选择器。请参阅我发布的链接,在那里的最佳答案中有很好的解释。

标签: ios swift xcode


【解决方案1】:

我认为不可能做你正在尝试的事情,你可以这样尝试:

var buttons: [UIButton: String] = []

let button = UIButton()
let urlString = "Random string which is different for every button"
buttons[button] = urlString
button.addTarget(self, action: #selector(didTapOnButton), for: .touchUpInside

@objc func didTapOnButton(sender: UIButton) { 
    let urlString = self.buttons[sender]
    // Do something with my URL
}

我记得 UIButton 是可散列的...

另一种选择是扩展 UIButton 以保存您想要的信息:

extension UIButton {
     private static var _urlStringComputedProperty = [String: String]()
     var urlString String {
        get {
            let tmpAddress = String(format: "%p", unsafeBitCast(self, to: Int.self))
            return Self._urlStringComputedProperty[tmpAddress]
        }
        set(newValue) {
            let tmpAddress = String(format: "%p", unsafeBitCast(self, to: Int.self))
            Self._urlStringComputedProperty[tmpAddress] = newValue
        }
     }
}

let button = UIButton()
button.urlString = "Random string which is different for every button"
button.addTarget(self, action: #selector(didTapOnButton), for: .touchUpInside

@objc func didTapOnButton(sender: UIButton) { 
    let urlString = sender.urlString
    // Do something with my URL
}

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2020-06-20
    • 1970-01-01
    • 2020-10-31
    • 2023-04-05
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多