如何知道何时单击十进制键盘上的删除按钮

Posted

技术标签:

【中文标题】如何知道何时单击十进制键盘上的删除按钮【英文标题】: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 移动到另一个。

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何知道何时单击十进制键盘上的删除按钮的主要内容,如果未能解决你的问题,请参考以下文章

Android如何检测“删除”按钮按键盘上删除单个字符?

当软键盘可见时,无法单击按钮

我如何知道何时单击了 Flex DataGrid itemRenderer 中的按钮?

如何知道键盘何时隐藏文本字段?

如何在 iOS 6+ 上检测用户何时强制隐藏 iPad 上的键盘

如何拦截转到 Java Swing JTextField 的键盘敲击?