Swift:在UIView中一键交替显示多个测试信息。

问题描述 投票:0回答:1

我想实现一个按钮--点击一次显示第一条信息,第二次点击会变成第二条信息,第三次点击会变成第三条信息。

我找了一个可能的解决方案是使用 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"
}

现在的问题是,当我点击按钮时,它只会显示最后一条信息。这样做可能不是一个聪明的方法。

非常感谢大家的意见,如果这是个比较简单的问题,我很抱歉。

ios swift xcode uiview
1个回答
1
投票

为什么不直接设置一个计数器并在每次激活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
   */


}

2
投票

你可以实现一个自定义的 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的命名习惯是以小写字母开头的方法和属性来命名。

© www.soinside.com 2019 - 2024. All rights reserved.