【问题标题】:Segmented control not changing index分段控制不改变索引
【发布时间】:2018-08-30 13:14:04
【问题描述】:

我正在编写一个游戏,我有一个分段控件供用户选择难度级别。我在案例中添加了一些简单的代码来检查索引是否更改,但似乎没有更改。代码如下:

@IBAction func chooseOnePlayerDifficulty(_ sender: UISegmentedControl) {
    switch onePlayerGameType {
        case .sluggish:
            onePlayerGameType = typeOfGame.sluggish
            print("Sluggish difficulty selected.")
        case .average:
            onePlayerGameType = typeOfGame.average
            print("Average difficulty selected.")
        case .ninja:
            onePlayerGameType = typeOfGame.ninja
            print("Ninja difficulty selected.")
    }
}

现在,当我在模拟器中进行测试时,唯一打印到控制台的内容是“选择了平均难度”。不管我选择哪一个。为什么会发生这种情况,我该如何解决?

编辑:我通过在另一个论坛上提出这个问题找到了一个有效的答案。不过感谢您的帮助。这是对我有用的答案:Here is the link to the answer

【问题讨论】:

  • 您为什么期望onePlayerGameType 的值发生变化?无论它具有什么值,您的代码都将其设置为相同的值。而且您的任何代码都不依赖于分段控件。

标签: ios swift uisegmentedcontrol


【解决方案1】:

您的这部分代码将onePlayerGameType 设置为.average,当您再次选择控件时,该值仍然是.average

 case .average:
        onePlayerGameType = typeOfGame.average

我有一个分段控件供用户选择难度级别

如果这就是你所需要的,为什么你需要switch 而不是直接分配它?

enum typeOfGame : Int {
     case sluggish
     case average
     case ninja
}

@IBAction func chooseOnePlayerDifficulty(_ sender: UISegmentedControl) {
                           // assuming  typeOfGame is enum
    let difficultyLevel =  typeOfGame(rawValue: sender.selectedSegmentIndex)
    onePlayerGameType = difficultyLEvel
}

【讨论】:

  • 但是编译器如何知道每个索引的难度?
  • @Uzair 更新了答案。我不知道你的typeOfGame 看起来怎么样。如果您在问题中发布代码会有所帮助
  • 我会为您的case 的每个case 设置特定的Int 值,以确保它们获得与分段控件的索引相对应的值。
【解决方案2】:

我希望你在 StoryBoard/XIB 或代码中注册了带有段控制的动作方法

segmentedControl.addTarget(self, action: "chooseOnePlayerDifficulty:", forControlEvents: .ValueChanged)

尝试跟随

@IBAction func chooseOnePlayerDifficulty(_ sender: UISegmentedControl) {
    let selectedSegment = sender.selectedSegmentIndex
    switch selectedSegment {
    case 0:
        onePlayerGameType = typeOfGame.sluggish
        print("Sluggish difficulty selected.")
    case 1:
        onePlayerGameType = typeOfGame.average
        print("Average difficulty selected.")
    case 2:
        onePlayerGameType = typeOfGame.ninja
        print("Ninja difficulty selected.")
    default:
        print("Assing default")
    }
}

编辑正确的@JakeG,更新答案

【讨论】:

  • 我应该将操作方法​​放在代码中的什么位置?我没有 XIB 文件。
  • 当您通过情节提要创建IBAction 时,如果您选择ValueChanged 作为事件类型,则无需以编程方式添加该行。
  • 索引从 0 开始,所以我猜你希望 .sluggish 从 case 0 开始,而不是 case 1(其余的都减 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多