提问人:Richard Knop 提问时间:4/10/2012 最后编辑:GingerHeadRichard Knop 更新时间:5/19/2023 访问量:106430
如何将“完成”按钮添加到键盘?
How to add Done button to the keyboard?
问:
更新:
我还尝试实现 UITextViewDelegate 委托,然后在我的控制器中执行:
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
[textView resignFirstResponder];
return YES;
}
我还将文本视图的委托设置为 self(控制器视图实例)。
单击“完成”按钮仍然只插入一个新行:(
更新:
到目前为止我做了什么。我已经通过我的视图控制器实现了一个 UITextFieldDelegate。
我已通过插座将文本视图连接到视图控制器。
然后我做了:
self.myTextView.delegate = self;
和:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
但是当我单击“完成”按钮时,它只是添加了一个新行。
所以我的场景上有一个 UITextView 元素,当用户点击它时,键盘就会出现,可以对其进行编辑。
但是,我不能关闭键盘。
如何将“完成”按钮添加到键盘上以便将其关闭?
答:
这很简单:)
[textField setReturnKeyType:UIReturnKeyDone];
要关闭键盘,请在类中实现协议,请设置<UITextFieldDelegate>
textfield.delegate = self;
并使用
- (void)textFieldDidEndEditing:(UITextField *)textField {
[textField resignFirstResponder];
}
或
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
评论
UITextField
<UITextFieldDelegate>
<UITextViewDelegate>
\n
or
and
在 Interface Builder 中,在 textView 的属性上,您可以将返回按钮类型设置为 Done。
然后,您需要检查何时按下“返回”按钮
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
检查文本是否 == “/n”,然后通过在 textView 上辞职第一响应者来关闭键盘。
进入你的故事板,选择你的文本字段,在属性检查器下有一个选项,上面写着“返回键”......选择“完成”。
然后进入 ViewController 并添加:
- (IBAction)dismissKeyboard:(id)sender;
{
[textField becomeFirstResponder];
[textField resignFirstResponder];
}
然后返回您的文本字段,单击插座并链接“退出时结束”以关闭键盘操作。
评论
在检查器中文本栏的选项下设置该选项。
然后右键单击文本字段,在按住的同时选择并将其拖到您的文件中。这将创建一个方法。为方法命名,然后输入以下值:'Return Key'
text field
CTRL
'Did End On Exit'
view controllers
IBAction
[textField becomeFirstResponder];
[textField resignFirstResponder];
您的方法应如下所示:
- (IBAction)methodName:(id)sender;
{
[sender becomeFirstResponder];
[sender resignFirstResponder];
}
好的,所以我也一直在为这个问题而苦苦挣扎。目前,我正在访问UITableViewCell中的UITextView(通过标签)。因为我使用的是原型细胞,所以我不能像大家建议的那样使用 IBActions 或 IBOutlets。相反,我正在使用;
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
然后,这将在用户每次点击按钮时为我提供文本。然后,我的解决方案是获取换行的 ascii 字符;“/n”。如果这是输入的文本,我将辞去第一响应者的职务。例如;
// If the text length is 0 then the user is deleting something, so only check the ascii character if there is text to check if (text.length != 0) { // Get the Ascii character int asciiCode = [text characterAtIndex:0]; // If the ascii code is /n or new line, then resign first responder if (asciiCode == 10) { [alertTextView resignFirstResponder]; [DeviceTextView resignFirstResponder]; } }
不确定是否有其他人需要这个黑客解决方案,但我想我会把它放在那里,以防有人需要它!
Swift 版本:
在 ViewController 中:
textField.returnKeyType = UIReturnKeyType.Done
textField.delegate = self
在 ViewController 之后
extension MyViewController: UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
评论
这是在键盘上添加完成按钮的最佳方式
textField.returnKeyType = UIReturnKeyDone;
将 UIToolBar 添加为自定义视图,其中将“完成”按钮作为 UIBarButtonItem。
这是将“完成”按钮添加到任何类型的键盘的更安全、更干净的方式。创建 UIToolBar,向其添加 Done Button,并设置任何 UITextField 或 UITextView 的 inputAccessoryView。
UIToolbar *ViewForDoneButtonOnKeyboard = [[UIToolbar alloc] init];
[ViewForDoneButtonOnKeyboard sizeToFit];
UIBarButtonItem *btnDoneOnKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"Done"
style:UIBarButtonItemStyleBordered target:self
action:@selector(doneBtnFromKeyboardClicked:)];
[ViewForDoneButtonOnKeyboard setItems:[NSArray arrayWithObjects:btnDoneOnKeyboard, nil]];
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard;
IBAction For Done 按钮
- (IBAction)doneBtnFromKeyboardClicked:(id)sender
{
NSLog(@"Done Button Clicked.");
//Hide Keyboard by endEditing or Anything you want.
[self.view endEditing:YES];
}
SWIFT 3 (英语)
var ViewForDoneButtonOnKeyboard = UIToolbar()
ViewForDoneButtonOnKeyboard.sizeToFit()
var btnDoneOnKeyboard = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: #selector(self.doneBtnFromKeyboardClicked))
ViewForDoneButtonOnKeyboard.items = [btnDoneOnKeyboard]
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard
功能
@IBAction func doneBtnFromKeyboardClicked (sender: Any) {
print("Done Button Clicked.")
//Hide Keyboard by endEditing or Anything you want.
self.view.endEditing(true)
}
评论
let ViewForDoneButtonOnKeyboard = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: 500.0, height: 70))
CGRect
<NSAutoresizingMaskLayoutConstraint:0x283c6ff70 h=--& v=--& _UIToolbarContentView:0x102c5e7f0.width == 0 (active)>
以下是我的方法,在.单击时,让它发送事件。我使用此事件来处理多个文本字段之间的焦点问题。Swift 3
doneBtn
.editingDidEndOnExit
// My customized UITextField
class MyTextField: UITextField {
override func awakeFromNib() {
super.awakeFromNib()
// Add toolBar when keyboardType in this set.
let set : [UIKeyboardType] = [.numberPad, .phonePad]
if (set.contains(self.keyboardType) ) {
self.addDoneToolbar()
}
}
// Add a toolbar with a `Done` button
func addDoneToolbar() {
let toolbar = UIToolbar()
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onToolBarDone))
toolbar.items = [space, doneBtn]
toolbar.sizeToFit()
self.inputAccessoryView = toolbar
}
@objc func onToolBarDone() {
// I use `editingDidEndOnExit` to simulate the `Done` behavior
// on the original keyboard.
self.sendActions(for: .editingDidEndOnExit)
}
}
适用于 Swift 5 及以上版本
extension UITextField {
func addDoneButtonOnKeyboard() {
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
target: nil, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done,
target: self, action: #selector(resignFirstResponder))
keyboardToolbar.items = [flexibleSpace, doneButton]
self.inputAccessoryView = keyboardToolbar
}
}
extension UITextView{
func addDoneButtonKeyboard(){
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace,
target: nil, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done,
target: self, action: #selector(resignFirstResponder))
keyboardToolbar.items = [flexibleSpace, doneButton]
self.inputAccessoryView = keyboardToolbar
}
}
iOS 14+ 解决方案
编辑:在 iOS 15 上为我工作,但在 iOS 16 上不为我工作
这将在键带上方的字段中心放置一个“完成”按钮。
TextField("MyField")
.toolbar{
Button("Done"){
//Close keyboard
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}.tint(.blue)
}
评论