Swift: one button to alternate multiple test message in UIView

大兔子大兔子 提交于 2020-06-13 09:17:15

问题


I am trying to implement one button- one click to display the first message, the second click would change to second message, the third click would change to the third message.

I looked up to one possible solution is to use UITapGestureRecognizer - single tap and double tap, which means I can trigger the button (single tap to display the first message and double tap to display the second message).

However, if I have more than two lines and I just want to display them by clicking each one (like animation). Would that be possible to just deal with that inside one UIView and UIbutton?

I currently have 3 simple messages:

@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"
}

The problem now is when I click the button it would just go the last message. That might not be a clever way to do so.

Thanks so much for the inputs and I am sorry if that is a rather simple question.


回答1:


Why not just set a counter and increment it every time your IBAction is activated?

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
   */


}



回答2:


You can implement a custom CaseIterable enumeration to perform a loop so that you can get the next element every time you press a button:

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

Create a enumeration with your transportation modes:

enum Mode: String, CaseIterable {
    case cycling, driving, walking
}

add a mode property to your view controller and set the initial value

var mode: Mode = .cycling

Now you can simply call the next mode method every time you press the button:

func ChangingTapped(_ btn: UIButton) {
    Textfield.text = "Changing to " + mode.next().rawValue
}

Note: It is Swift naming convention to name your methods and properties starting with a lowercase letter.



来源:https://stackoverflow.com/questions/62254197/swift-one-button-to-alternate-multiple-test-message-in-uiview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!