【问题标题】:How to know when the delete button on decimal pad is clicked如何知道何时单击十进制键盘上的删除按钮
【发布时间】:2015-04-28 06:55:45
【问题描述】:

我有四个textFields,每个只需要一个字符,类似于锁定屏幕。我可以输入并从一个textField 移动到下一个textField
问题是当我想删除并移动到上一个textField 时,我不知道何时单击了删除按钮

我正在使用:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool

输入并从一个textField 移动到另一个。

我如何知道何时按下了删除键?

【问题讨论】:

    标签: ios swift uitextfielddelegate


    【解决方案1】:

    编辑/更新:

    Xcode 11 • Swift 5.2 或更高版本

    跟进这个问题,可以在post 上找到 Swift 5 语法


    原答案

    斯威夫特 1.x

    跟进 Istvan 的回答,您需要在按下 deleteBackward 时发布通知:

    class DigitField: UITextField {
        override func deleteBackward() {
            super.deleteBackward()
            NSNotificationCenter.defaultCenter().postNotificationName("deletePressed", object: nil)
        }
    
    }
    

    然后在 viewDidLoad() 中添加一个观察者如下:

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "goPrevious", name: "deletePressed", object: nil)
    

    还有你的方法:

    func goPrevious() {
        if secondDigit.isFirstResponder() {
            secondDigit.enabled = false
            firstDigit.enabled = true
            firstDigit.becomeFirstResponder()
        } else if thirdDigit.isFirstResponder() {
            thirdDigit.enabled = false
            secondDigit.enabled = true
            secondDigit.becomeFirstResponder()
        } else if fourthDigit.isFirstResponder() {
            fourthDigit.enabled = false
            thirdDigit.enabled = true
            thirdDigit.becomeFirstResponder()
        }
    }
    

    选择您的文本字段并将其连接到您的 DigitField

    您需要将每个文本字段连接到 IBAction(使用已发送事件编辑更改)

    视图控制器代码应如下所示:

    import UIKit
    
    class ViewController: UIViewController {
        
        @IBOutlet weak var firstDigit: UITextField!
        @IBOutlet weak var secondDigit: UITextField!
        @IBOutlet weak var thirdDigit: UITextField!
        @IBOutlet weak var fourthDigit: UITextField!
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "goPrevious", name: "deletePressed", object: nil)
            
            firstDigit.secureTextEntry = true
            secondDigit.secureTextEntry = true
            thirdDigit.secureTextEntry = true
            fourthDigit.secureTextEntry = true
    
            firstDigit.keyboardType = .DecimalPad
            secondDigit.keyboardType = .DecimalPad
            thirdDigit.keyboardType = .DecimalPad
            fourthDigit.keyboardType = .DecimalPad
    
            firstDigit.becomeFirstResponder()
            secondDigit.enabled = false
            thirdDigit.enabled = false
            fourthDigit.enabled = false
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
        
        func goPrevious() {
            if secondDigit.isFirstResponder() {
                secondDigit.enabled = false
                firstDigit.enabled = true
                firstDigit.becomeFirstResponder()
            } else if thirdDigit.isFirstResponder() {
                thirdDigit.enabled = false
                secondDigit.enabled = true
                secondDigit.becomeFirstResponder()
            } else if fourthDigit.isFirstResponder() {
                fourthDigit.enabled = false
                thirdDigit.enabled = true
                thirdDigit.becomeFirstResponder()
            }
        }
        // You need to connect each text field to an IBAction (using sent events editing changed) – 
        @IBAction func firstChanged(sender: UITextField) {
            if let digitOne = sender.text.toInt() {
                println(digitOne)
                sender.enabled = false
                secondDigit.enabled = true
                secondDigit.becomeFirstResponder()
            } else {
                sender.text = ""
            }
        }
        
        @IBAction func secondChanged(sender: UITextField) {
            if let digitTwo = sender.text.toInt() {
                println(digitTwo)
                sender.enabled = false
                thirdDigit.enabled = true
    
                thirdDigit.becomeFirstResponder()
            } else {
                sender.text = ""
            }
        }
        
        @IBAction func thirdChanged(sender: UITextField) {
            if let digitThree = sender.text.toInt() {
                println(digitThree)
                sender.enabled = false
                fourthDigit.enabled = true
                fourthDigit.becomeFirstResponder()
            } else {
                sender.text = ""
            }
        }
        
        @IBAction func fourthChanged(sender: UITextField) {
            if let digitFour = sender.text.toInt() {
                println(digitFour)
                sender.enabled = false
            } else {
                sender.text = ""
            }
        }
    }
    

    【讨论】:

    • 查看所有答案,这应该是一件容易的事。但我无法让它工作。
    • 一切都有效,除了删除。视图控制器中如何调用 DigitField 类?
    • 只需选择您的文本字段并将自定义类下拉更改为您创建的自定义文本字段
    • 部署目标是否有所不同。因为您的部署目标是 8.3,而我将其更改为 7.0。并且删除也不适用于您的项目。
    • 对不起,我一整天都在努力让它工作。无意失礼,但我非常感谢您的帮助。
    【解决方案2】:

    子类 UITextField 如下:

    import UIKit
    
    class MyTextField: UITextField {
        override func deleteBackward() {
            super.deleteBackward()
    
            println("Delete button was tapped")
        }
    }
    

    然后将文本字段的类更改为 MyTextField。应该这样做!

    【讨论】:

    • func textField(textField: MyTextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 。上面的类和方法一无所获。
    【解决方案3】:

    对于类似的问题,in this answer 有一个可能的解决方案。你可以继承你的 UITextField,然后在你的子类中重写这个方法:

    (BOOL)keyboardInputShouldDelete:(UITextField *)textField
    

    如果这段代码在 Objective-C 中,它应该告诉你正确使用这个方法。

    【讨论】:

      【解决方案4】:

      在函数中使用replacementString 以了解 UItextField 中发生的情况

      - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
          if (string.length == 0) {
              //delete
          } else {
              //any other key
          }
      
          return YES;
      }
      

      【讨论】:

      • 是我的第一种方法,在第一个文本输入之后,长度总是一个。也尝试使用字符串值,但无法处理删除。
      【解决方案5】:

      希望我的回答对你有帮助:

      func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
          let  char = string.cStringUsingEncoding(NSUTF8StringEncoding)!
          let isBackSpace = strcmp(char, "\\b")
      
          if (isBackSpace == -92) {
              println("Backspace was pressed")
          }
      
          return true
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 2020-02-16
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多