0

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.

swiftlearneer
  • 296
  • 2
  • 10
  • Consider using a standard control such as `UISegmentedControl`. It is a familiar UI element for users, it allows them to see all available options and they can directly select the required option – Paulw11 Jun 08 '20 at 03:05

2 Answers2

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.

Leo Dabus
  • 198,248
  • 51
  • 423
  • 494
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
   */


}