-->

How to know when the delete button on decimal pad

2019-04-02 21:40发布

问题:

I have four textFields and each takes only one character, similar to the lock screen. I can input and move from one textField to next textField.
Problem is when I want to delete and move to previous textField, I don't know when the delete button is clicked.

I'm using:

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

to input and move from one textField to another.

How do I know when the delete key is pressed?

回答1:

Following up Istvan answer, you need to post a notification when the deleteBackward is pressed:

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

}

Then inside viewDidLoad() you add an observer as follow:

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

and your method:

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 your text field and connect it to your DigitField

You need to connect each text field to an IBAction (using sent events editing changed)

The view controller code should look like this:

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 = ""
        }
    }
}


回答2:

Subclass UITextField as follows:

import UIKit

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

        println("Delete button was tapped")
    }
}

Then change the class of your text field to MyTextField. That should do it!



回答3:

There is a possible solution in this answer to a similar question. You can subclass your UITextField and then override this method in your subclass:

(BOOL)keyboardInputShouldDelete:(UITextField *)textField

Event this code is in Objective-C, it should show you the proper use of this method.



回答4:

Use replacementString in function to know whats happening in UItextField

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

    return YES;
}


回答5:

I hope my answer will help you:

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
}