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'。
我不明白为什么会出现这种错误。
提前致谢。
答案 0 :(得分:1)
UIButton
不符合NSCopying
protocol
,因此您无法将其用作NSDictionary
来自Apple文档:
密钥被复制(使用copyWithZone:;密钥必须符合 NSCopying协议)。
参考:pheelicks回答This Question
答案 1 :(得分:0)
我们真的不确定为什么要使用NSString
或NSMutableArray
,尤其要考虑到您将NSString
与String
联系起来,这暗示NSString
实际上没用。
本地buttons
和dict
数组似乎也是不必要的,因为在完成循环后,您只需将这些按钮分配给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
}
您还可以按标题访问按钮,反之亦然。