我有一个应用程序,用户可以在屏幕上选择多个不同的按钮。当用户选择按钮时,它变为绿色,文本将在以后的视图中使用。我试图通过最小化我正在编写的代码量来使一切变得美好而迅捷。
每个按钮都连接到同一个动作,其标识由其标记决定。我所做的是创建2个数组来跟踪卡名称及其开/关状态。当按下一张卡时,会调用cardPressed功能,这决定了当前是将卡转为绿色还是白色(稍后会做更多的事情)。
我想要做的是在一行代码中执行颜色更改,而不是
cardOne.backgroundColor = UIColor.white
我想这样做[#1]
cardList[cardNumber].backgroundColor = UIColor.green
这样我的插座会根据所做的选择而改变。我通常会有一个像这样读取的大量switch语句
switch cardList[cardNumber] {
case 0:
cardOne.backgroundColor = UIColor.green
case 1:
cardTwo.backgroundColor = UIColor.green
case 2:
cardThree.backgroundColor = UIColor.green
case So on so forth:
cardInfinity.......
default:
break
}
显然,当我尝试[#1]时,我收到一个错误,因为它是一个字符串,而不是一个插座连接。我想知道的是,无论如何都要欺骗xcode将其识别为插座,或者更好的方法是改变我在一行代码中所使用的插座?
希望我没有过多的漫步,你可以理解我的思考过程!我已经包含了下面的所有相关代码,显然它不会编译。如果您有任何想法,他们将不胜感激,或者如果我太乐观了,这是不可能的,请告诉我:)现在我将使用一个大的开关声明! (也许这对我将来很有用!)
谢谢!
private let cardList = ["cardOne","cardTwo","cardThree"]
private var cardState = [false, false, false]
//Card functions
private func selectCard(cardNumber: Int){
cardState[cardNumber] = true
cardList[cardNumber].backgroundColor = UIColor.green
}
private func deselectCard(cardNumber: Int){
cardState[cardNumber] = false
//cardOne.backgroundColor = UIColor.white
}
//Decide which function to perform, based on the card information recieved
private func cardPressed(cardNumber: Int){
let selectedCardName = cardList[cardNumber]
let selectedCardState = cardState[cardNumber]
print("\(selectedCardName)")
print("\(selectedCardState)")
switch selectedCardState {
case true:
deselectCard(cardNumber: cardNumber)
case false:
selectCard(cardNumber: cardNumber)
}
}
//UI Connections
//Card button actions
@IBAction func buttonPressed(_ sender: UIButton) {
//Determine which button has been pressed
//let cardName = sender.currentTitle!
let cardSelection = sender.tag - 1
cardPressed(cardNumber: cardSelection)
}
//Card button outlets
@IBOutlet weak var cardOne: UIButton!
@IBOutlet weak var cardTwo: UIButton!
答案 0 :(得分:1)
解决方案在于面向对象编程的精彩世界。您可以创建自己的数据类型来将这些数据和行为组合在一起,而不是使用并行数组。
如果您创建了自己的UIButton
子类,则可以跟踪是否使用自己的自定义属性选择了按钮,并根据需要进行可视修改。
class CardButton: UIButton {
var isChosen: Bool = false {
didSet { backgroundColor = isChosen ? UIColor.green : UIColor.white }
}
}
如果您将故事板中的按钮设置为新的CardButton
类型,则可以在代码中使用其isChosen
属性。
您的buttonPressed
功能可能会是这样的:
@IBAction func buttonPressed(_ sender: CardButton) {
sender.isChosen = !sender.isChosen
}
这样您就可以删除大部分现有代码,因为数据存储在每个按钮中。