如何知道何时单击小数位上的删除按钮

How to know when the delete button on decimal pad is clicked

我有四个textField,每个只占一个字符,类似于锁屏。我可以输入并从一个 textField 移动到下一个 textField.
问题是当我想删除并移动到上一个 textField 时,我不知道 删除按钮 何时被点击。

我正在使用:

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

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

我怎么知道何时按下删除键?

类似问题有一个可能的解决方案 in this answer。您可以将 UITextField 子类化,然后在您的子类中覆盖此方法:

(BOOL)keyboardInputShouldDelete:(UITextField *)textField

事件代码在 Objective-C 中,它应该向您展示此方法的正确用法。

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

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

    return YES;
}

希望我的回答对您有所帮助:

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
}

Subclass UITextField如下:

import UIKit

class MyTextField: UITextField {
    override func deleteBackward() {
        super.deleteBackward()

        println("Delete button was tapped")
    }
}

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

edit/update:

Xcode 11 • Swift 5.2 或更高版本

跟进这个问题,Swift 5 种语法可以在这个

上找到

原回答

Swift 1.x

跟进 Istvan 的回答,您需要 post 按下 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()
    }
}

Select 您的文本字段并将其连接到您的 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 = ""
        }
    }
}