我想实现一个按钮--点击一次显示第一条信息,第二次点击会变成第二条信息,第三次点击会变成第三条信息。
我找了一个可能的解决方案是使用 UITapGestureRecognizer - 单点和双点。这意味着我可以触发按钮(单点显示第一条信息,双点显示第二条信息)。
但是,如果我有两行以上的信息,我只想通过点击每一行来显示它们(像动画一样)。那是否可以只在一个UIView和UIbutton里面处理?
我目前有3条简单的消息。
@IBOutlet weak var Textfield: UITextView!
@IBOutlet weak var Changingbutton: UIButton!
@IBAction func ChangingTapped(_ btn: UIButton) {
Textfield.text = "Changing to driving"
Textfield.text = "Changing to walking"
Textfield.text = "Changing to cycling"
}
现在的问题是,当我点击按钮时,它只会显示最后一条信息。这样做可能不是一个聪明的方法。
非常感谢大家的意见,如果这是个比较简单的问题,我很抱歉。
为什么不直接设置一个计数器并在每次激活IBAction时递增呢?
var x = 0
@IBAction func ChangingTapped(_ btn: UIButton) {
if(x==0){
Textfield.text = "Changing to driving"
}
else if(x==1){
Textfield.text = "Changing to walking"
}
else{
Textfield.text = "Changing to cycling"
}
x +=1
//if x needs to be reset
/*
if(x > 2) x = 0
*/
}
你可以实现一个自定义的 CaseIterable
枚举来执行一个循环,这样每次按下按钮都能得到下一个元素。
extension CaseIterable where Self: Equatable {
var allCases: AllCases { Self.allCases }
var nextCase: Self {
let index = allCases.index(after: allCases.firstIndex(of: self)!)
guard index != allCases.endIndex else { return allCases.first! }
return allCases[index]
}
@discardableResult
mutating func next() -> Self {
self = nextCase
return self
}
}
用你的运输模式创建一个枚举。
enum Mode: String, CaseIterable {
case cycling, driving, walking
}
在你的视图控制器中添加一个模式属性,并设置初始值。
var mode: Mode = .cycling
现在你可以简单地在每次按下按钮时调用下一个模式方法。
func ChangingTapped(_ btn: UIButton) {
Textfield.text = "Changing to " + mode.next().rawValue
}
注意: Swift的命名习惯是以小写字母开头的方法和属性来命名。