[UIButton copyWithZone:]:发送到实例的无法识别的选择器

时间:2017-10-24 10:23:37

标签: ios swift xcode uibutton nsmutabledictionary

    func createRowOfButtons(buttonTitles: [NSString]) -> UIView {
    var buttons = [UIButton]()
    let keyboardRowView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
    var dict = [UIButton:String]()
    for buttonTitle in buttonTitles 
    {
       let button = createButtonWithTitle(title: buttonTitle as String)
        buttons.append(button)
        keyboardRowView.addSubview(button)
        dict.updateValue("\(buttonTitle)", forKey: button)
    }
    allButtons = NSMutableDictionary(dictionary: dict)
    //error:[UIButton copyWithZone:]: unrecognized selector sent to instance 0x7e011bc0
    addIndividualButtonConstraints(buttons: buttons, mainView:keyboardRowView)
    return keyboardRowView
}

我是iOS新手,我想创建一个NSMutableDictionary UIButton,但它会出现以下错误:

  

无法将'UIButton'转换为'NSCopying'。

我不明白为什么会出现这种错误。

提前致谢。

2 个答案:

答案 0 :(得分:1)

UIButton不符合NSCopying protocol,因此您无法将其用作NSDictionary

中的关键字

来自Apple文档:

  

密钥被复制(使用copyWithZone:;密钥必须符合   NSCopying协议)。

参考:pheelicks回答This Question

答案 1 :(得分:0)

我们真的不确定为什么要使用NSStringNSMutableArray,尤其要考虑到您将NSStringString联系起来,这暗示NSString实际上没用。

本地buttonsdict数组似乎也是不必要的,因为在完成循环后,您只需将这些按钮分配给allButtons。这意味着您可以直接处理该存储(使用正确的Swift [String: UIButton]类型而不是NSMutableDictionary):

var allButtons: [String: UIButton]!

func createRowOfButtons(buttonTitles: [String]) -> UIView {

    let keyboardRowView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 50))

    // Initialize / reset dictionary
    // Do it here or on declaration
    allButtons = [String: UIButton]()

    // Populate dictionary
    buttonTitles.forEach { title in
        let button = UIButton()// createButtonWithTitle(title: title)
        keyboardRowView.addSubview(button)
        allButtons[title] = button
    }

    addIndividualButtonConstraints(buttons: Array(allButtons.values),
                                   mainView: keyboardRowView)
    return keyboardRowView
}

您还可以按标题访问按钮,反之亦然。