我可以使用阵列更改插座,而不是硬编码所有内容吗?

时间:2017-10-24 21:53:19

标签: swift xcode

我有一个应用程序,用户可以在屏幕上选择多个不同的按钮。当用户选择按钮时,它变为绿色,文本将在以后的视图中使用。我试图通过最小化我正在编写的代码量来使一切变得美好而迅捷。

每个按钮都连接到同一个动作,其标识由其标记决定。我所做的是创建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!

1 个答案:

答案 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
}

这样您就可以删除大部分现有代码,因为数据存储在每个按钮中。