UISegmentedControl和.selectedSegmentIndex错误值?

时间:2015-10-23 12:56:01

标签: ios swift swift2

我的代码中有一个简单的Segment,包含3个元素。出于测试目的,我也有一个变量,它根据我按下(3)的哪个段递增。该变量的值打印在UITextView中。这是代码:

import UIKit
class ViewController: UIViewController
{
    @IBOutlet weak var segment: UISegmentedControl!
    @IBOutlet weak var prwtoView: UIView!
    @IBOutlet weak var prwtoText: UITextField!

    var i : Int = 0

    override func viewWillAppear(animated: Bool)
    {
        prwtoText.backgroundColor = UIColor.purpleColor()
        prwtoText.textColor = UIColor.whiteColor()
        segment.setTitle("Zero", forSegmentAtIndex: 0)
        segment.addTarget(self, action: "action", forControlEvents: .ValueChanged)
        segment.insertSegmentWithTitle("random", atIndex: 2, animated: false)
    }
    func action()
    {
        let argumentForSegment = segment.selectedSegmentIndex
        if argumentForSegment == 0
        {
            i = 0
        }
        if argumentForSegment == 1
        {
            i += 2
        }
        else
        {
            i += Int(arc4random_uniform(100))
        }
        print(argumentForSegment)
        prwtoText.text = "\(i)"
    }

}

虽然我知道它以值-1开头,但如果没有按下,我不希望我的应用做任何事情。问题是,即使我按下第一个段(0)并且它应该使i = 0它不会这样做,尽管如果我在我的终端中打印argumentForSegment它确实显示0为值。总结一下,每次按下零段(0),我的i值都不会变为0.也许我使用UISegmentedControl中的错误方法?

编辑:通过更改以下代码解决了问题:

func action()
{
    let argumentForSegment = segment.selectedSegmentIndex
    if argumentForSegment == 0
    {
        i = 0
    }
    if argumentForSegment == 1
    {
        i += 2
    }
    else
    {
        i += Int(arc4random_uniform(100))
    }
    print(argumentForSegment)
    prwtoText.text = "\(i)"
}

为:

func action()
{
    let argumentForSegment = segment.selectedSegmentIndex
    if argumentForSegment == 0
    {
        i = 0
    }
    if argumentForSegment == 1
    {
        i += 2
    }
    else if argumentForSegment == 2   //  <==== here
    {
        i += Int(arc4random_uniform(100))
    }
    print(argumentForSegment)
    prwtoText.text = "\(i)"
}

有人可以解释为什么它使用else的优先级,虽然打印argumentForSegment时值为零?换句话说,为什么当else单独使用argumentForSegment == 0时,它选择了else而不是第一个语句?

2 个答案:

答案 0 :(得分:2)

  

有人可以解释为什么它使用了其他优先级,尽管   打印argumentForSegment时,值为零?换句话说,为什么   当我有一个else的其他值为argumentForSegment == 0它   选择了else而不是第一个语句?

当您遇到代码行为不符合预期的情况时,在调试器中逐步执行代码或添加一些诊断print语句会很有帮助。

例如:

func action()
{
    let argumentForSegment = segment.selectedSegmentIndex
    if argumentForSegment == 0
    {
        print("In first block")
        i = 0
    }
    if argumentForSegment == 1
    {
        print("In second block")
        i += 2
    }
    else
    {
        print("In third block")
        i += Int(arc4random_uniform(100))
    }
    print(argumentForSegment)
    prwtoText.text = "\(i)"
}

如果您这样做,您会注意到当argumentForSegment0时,输出将为:

In first block
In third block

所以,问题不在于它是在第一个块上选择第三个块。问题在于它正在做两件事。您希望它在检测到argumentForSegment0后停止,因此将else添加到第二个条件语句,以便它只在第一个条件语句失败时执行此操作:

func action()
{
    let argumentForSegment = segment.selectedSegmentIndex
    if argumentForSegment == 0
    {
        i = 0
    }
    else if argumentForSegment == 1  // added "else" here
    {
        i += 2
    }
    else
    {
        i += Int(arc4random_uniform(100))
    }
    print(argumentForSegment)
    prwtoText.text = "\(i)"
}

答案 1 :(得分:1)

为了改进Vacawama的答案,您可以使用switch语句更轻松地格式化:

func action() {

    let argumentForSegment = segment.selectedSegmentIndex

    switch argumentForSegment {
    case 0:
        i = 0
    case 1:
        i += 1
    case 2:
        i += Int(arc4random_uniform(100))
    default:
        break
    }

    print(argumentForSegment)
    prwtoText.text = "\(i)"

}

这类事情要干得多。

(谢谢,vacawama)