我的代码中有一个简单的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
而不是第一个语句?
答案 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)"
}
如果您这样做,您会注意到当argumentForSegment
为0
时,输出将为:
In first block In third block
所以,问题不在于它是在第一个块上选择第三个块。问题在于它正在做两件事。您希望它在检测到argumentForSegment
为0
后停止,因此将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)