在Suragch的答案基础上,我需要一个完成和退格按钮,如果你像我这样是个新手,这里可能会遇到一些错误,以下是我解决这些错误的方法。
出现EXC_BAD_ACCESS错误?
我包含了:
@objc(classname)
class classname: UIView{
}
我解决了我的问题,但是Suragch的更新答案似乎以更合适/正确的方式解决了这个问题。
出现SIGABRT错误?
另一个愚蠢的事情是将连接拖错了方向,导致了SIGABRT错误。不要从函数拖到按钮,而应该从按钮拖到函数。
添加"完成"按钮
我在keyboard.swift中的协议中添加了这个:
protocol KeyboardDelegate: class {
func keyWasTapped(character: String)
func keyDone()
}
然后将我的完成按钮与keyboard.swift连接一个新的IBAction,就像这样:
@IBAction func Done(sender: UIButton) {
self.delegate?.keyDone()
}
然后跳回到我使用此键盘的viewController.swift,并在keyWasTapped函数之后添加以下内容:
and then jumped back to my viewController.swift where i am using this keyboard and added this following after the function keyWasTapped:
func keyDone() {
view.endEditing(true)
}
添加删除键
这个问题曾让我困扰了很久,因为你必须在viewDidLoad()方法中将textField.delegate设置为self(稍后会展示)。
第一步:在keyboard.swift中向协议添加backspace()函数:
protocol KeyboardDelegate: class {
func keyWasTapped(character: String)
func keyDone()
func backspace()
}
第二步:添加一个类似于Done操作的新IBAction:
@IBAction func backspace(sender: UIButton) {
self.delegate?.backspace()
}
第三步:现在转到viewController.swift文件,在此处将NumberPad键盘显示出来。
重要提示:在viewDidLoad()方法中设置所有将使用此键盘的文本字段。因此,您的viewDidLoad()应该看起来像这样:
override func viewDidLoad() {
super.viewDidLoad()
self.myTextField1.delegate = self
self.myTextField2.delegate = self
let keyboardView = keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 240))
keyboardView.delegate = self
myTextField1.inputView = keyboardView
myTextField2.inputView = keyboardView
}
我不确定是否有一种方法可以将此操作应用于视图中的所有textField。这将非常方便...
第四步: 仍在viewController.swift中,我们需要添加一个变量和两个函数。代码如下:
var activeTextField = UITextField()
func textFieldDidBeginEditing(textField: UITextField) {
print("Setting Active Textfield")
self.activeTextField = textField
print("Active textField Set!")
}
func backspace() {
print("backspaced!")
activeTextField.deleteBackward()
}
这里正在解释发生了什么:
- 您创建一个变量来存储文本字段。
- 当"textFieldDidBeginEditing"被调用时,它设置变量以便知道我们正在处理哪个文本字段。我添加了大量的打印()以便知道所有内容都已被执行。
- 我们的退格功能然后检查我们正在处理的文本字段并使用.deleteBackward()。这会删除光标前的字符。
现在您应该可以开始处理业务了。非常感谢Suragchs帮助我实现这一点。