更新:
また、UITextViewDelegateデリゲートを実装してから、コントローラーで実行しようとしました。
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
{
[textView resignFirstResponder];
return YES;
}
また、テキストビューのデリゲートをself(コントローラービューインスタンス)に設定します。
[完了]ボタンをクリックしても、新しい行が挿入されます:(
更新:
これまでにやったこと。 View ControllerでUITextFieldDelegateを実装しました。
テキストビューをコンセント経由でView Controllerに接続しました。
それから私はやった:
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;
}
ストーリーボードに移動して、テキストフィールドを選択し、属性インスペクターの下に「リターンキー」...「完了」を選択するオプションがあります。
次に、ViewControllerに移動して以下を追加します。
- (IBAction)dismissKeyboard:(id)sender;
{
[textField becomeFirstResponder];
[textField resignFirstResponder];
}
次に、テキストフィールドに戻り、アウトレットをクリックし、「終了時に終了しました」リンクをクリックして、dismissKeyboardアクションを実行します。
IToolBarをUIBarButtonItemとして完了ボタンを持つカスタムビューとして追加します。
これは、任意のタイプのキーボードに[完了]ボタンを追加するより安全でクリーンな方法です。 UIToolBarを作成して[完了]ボタンを追加し、任意の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
- (IBAction)doneBtnFromKeyboardClicked:(id)sender
{
NSLog(@"Done Button Clicked.");
//Hide Keyboard by endEditing or Anything you want.
[self.view endEditing:YES];
}
Swift
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)
}
Swiftバージョン:
ViewControllerで:
textField.returnKeyType = UIReturnKeyType.Done
textField.delegate = self
ViewControllerの後
extension MyViewController: UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
さて、私もこの問題に苦労しています。現在、私はUITagViewCellのUITextViewに(タグを介して)アクセスしています。私はプロトタイプセルを使用しているため、誰もが示唆するようにIBActionsもIBOutletsも使用できません。代わりに、私は使用しています。
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
これにより、ユーザーがボタンを押すたびにテキストが提供されます。私の解決策は、新しい行のアスキー文字を取得することでした。 「/ 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]; } }
他の誰かがこのハッキーなソリューションを必要とするかどうかはわかりませんが、誰かがそれを必要とする場合に備えてそこに置くと思いました!
テキストフィールドのインスペクターで、'Return Key'
オプションの下にtext field
オプションを設定します。次に、テキストフィールドを右クリックし、CTRL
を押しながら'Did End On Exit'
を選択し、これをview controllers
ファイルにドラッグします。これにより、IBAction
メソッドが作成されます。メソッドに名前を付けて、次の値を入力します。
[textField becomeFirstResponder];
[textField resignFirstResponder];
メソッドは次のようになります。
- (IBAction)methodName:(id)sender;
{
[sender becomeFirstResponder];
[sender resignFirstResponder];
}
以下は私のアプローチです、Swift 3
。 doneBtn
がクリックされたら、.editingDidEndOnExit
イベント。このイベントを使用して、複数のtextField間のフォーカスの問題を処理します。
// 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)
}
}
これは、キーボードに完了ボタンを追加する最良の方法です
textField.returnKeyType = UIReturnKeyDone;