如何知道何时单击十进制键盘上的删除按钮
Posted
技术标签:
【中文标题】如何知道何时单击十进制键盘上的删除按钮【英文标题】:How to know when the delete button on decimal pad is clicked 【发布时间】:2015-04-28 06:55:45 【问题描述】:我有四个textField
s,每个只需要一个字符,类似于锁定屏幕。我可以输入并从一个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
【讨论】:
以上是关于如何知道何时单击十进制键盘上的删除按钮的主要内容,如果未能解决你的问题,请参考以下文章
我如何知道何时单击了 Flex DataGrid itemRenderer 中的按钮?