【问题标题】:Swift: How to use two func textfield at same timeSwift:如何同时使用两个 func 文本字段
【发布时间】:2017-07-05 08:00:22
【问题描述】:

我正在使用 Xcode 8 和 Swift 3。

我有一个项目,其中包含 3 个文本字段、1 个用于清除的按钮和用于显示结果的标签。

在我的类 ViewController 我有:

class ViewController: UIViewController,UITextFieldDelegate {

@IBOutlet weak var input1: UITextField!
@IBOutlet weak var input2: UITextField!
@IBOutlet weak var input3: UITextField!
@IBOutlet weak var lblResult: UILabel!
@IBOutlet weak var clearButton: UIButton!

我想将我的文本字段输入限制为最多 3 位数字,但也限制为 360 的值。我设法获得了这两种东西的代码,如果一次只使用一个,它们就可以工作,但是因为它们都以 func 文本字段开头,我可以不要让他们一起工作。我必须在不同的班级做吗? 我知道这是一个基本问题,但它是学习过程的一部分。

这是我要合并的两个代码:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
               replacementString string: String) -> Bool
{
    let maxLength = 3
    let currentString: NSString = textField.text! as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength
}

和:

func textField(_ textField: UITextField,
               shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool
{
    var startString = ""
    if (textField.text != nil)
    {
        startString += textField.text!
    }
    startString += string
    let limitNumber = Int(startString)
    if limitNumber! > 360
    {
        return false
    }
    else
    {
        return true;
    }
}

它们都在 ViewController 类中。

感谢您的帮助!

【问题讨论】:

  • 对于这种情况,我认为您不需要确定哪个textfield 是哪个。这些函数中的所有变量都是本地的。这些是UITextFieldDelegate 的功能。您是否将所有UITextFields 设置为self

标签: ios swift


【解决方案1】:

如果我没记错的话,这里就是你所需要的:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
               replacementString string: String) -> Bool {
    let maxLength = 3
    let limitValue = 360

    let text = textField.text!
    let currentString: NSString = text as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString

   var startString = ""

    if !text.isEmpty {
        startString += text
    }
    startString += string

    let limitNumber = Int(startString)!

    return limitNumber < limitValue && newString.length <= maxLength
}

更新:

自动聚焦在下一个 texfield 上。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, 
                   replacementString string: String) -> Bool {
    let maxLength = 3
    let limitValue = 360

    let text = textField.text!
    let currentString: NSString = text as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString

   var startString = ""

    if !text.isEmpty {
        startString += text
    }
    startString += string

    let limitNumber = Int(startString)!

    let newLength: Int = newString.length

    if textField == input1 {
        if newLength == maxLength {
            input2.becomeFirstResponder()
        }
    }
    if textField == input2 {
        if newLength == maxLength {
            input3.becomeFirstResponder()
        }
    }

    if textField == input3 {
        if newLength ==  maxLength {
           self.view.endEditing(true)
        }
    }

    return limitNumber < limitValue && newLength <= maxLength
}

【讨论】:

  • 顺便说一句,当我插入 3 位数字时,您是否还知道如何将光标从第一个文本字段自动切换到第二个等等?谢谢
【解决方案2】:

您需要在func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -&gt; Bool 中添加一个if statement,以检查当前的textField,如下所示:

func textField(_ textField: UITextField,  shouldChangeCharactersIn range: NSRange,  replacementString string: String) -> Bool {
   if textFiled == input1 {
   // do logic for input1
   } else if textFiled == input2 {
   // do logic for input2
   }
}

【讨论】:

    【解决方案3】:

    Swift switch 语句会做到这一点。

    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool
    {
        switch textField {
        case input1:
            // ...
        case input2:
            // ...
        case input3:
            // ...
        default:
            break
        }
    }
    

    【讨论】:

      【解决方案4】:

      人们不理解这个问题。实际上,您所需要的只是合并 javimuu 提到的声明。

      我的回答很糟糕,因为 javimuu 的回答是正确的,但我之所以写它是因为我没有足够的代表来否决那些以无用的方式互相投票的人。

        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
                     replacementString string: String) -> Bool
      {
          let maxLength = 3
          let currentString: NSString = textField.text! as NSString
          let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
      
          var startString = ""
          if (textField.text != nil)
          {
              startString += textField.text!
          }
          startString += string
          let limitNumber = Int(startString)
      
      
          return newString.length <= maxLength && limitNumber! <= 360
      }
      

      【讨论】:

      • 并非如此。回报不一样,更符合 FONSPA 的需求。但在全球范围内,是的,我同意,它看起来像。
      • 不关我的事。它直接来自 FONSPA 的代码。我没有运行单元测试来检查他的功能是否正确。我只是在回答他的实际问题。
      • 并非如此。回报不一样,更符合 FONSPA 的需求。但在全球范围内,是的,我同意,它看起来像
      • “我设法获得了这两件事的代码并且它们工作” - FONSPA。我相信
      • 因为它需要时间。我刚刚回答了他的问题。我没有读过他的代码。但好吧,我会的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多