Ich bin nicht daran interessiert, eine neue Tastatur zu erstellen. Ich möchte nur eine Schaltfläche zur UIToolBar hinzufügen und sie dann als inputAccessoryView zum Textfeld hinzufügen, wie hier: stackoverflow.com/a/11382044/3207979 , aber ich habe es nicht herausgefunden noch, wie es schnell geht ..
Dejan Skledar
Anstelle einer benutzerdefinierten Tastatur oder Symbolleiste können wir dies erreichen, indem wir der Standardtastatur eine benutzerdefinierte Schaltfläche hinzufügen. Verweisen Sie auf diese Antwort .
Soweit ich weiß, können Sie die Schaltfläche Fertig auf dem Tastaturteil nicht hinzufügen. Sie müssten inputAccessoryViewdem UITextFieldoder ein hinzufügen UITextView(wenn Sie dies verwenden).
Funktioniert perfekt. Schnelle und einfache Implementierung. Vielen Dank!
Octavio Antonio Cedeño
3
Sie können dies ändern und müssen die Schaltfläche nicht lokalisieren: let done: UIBarButtonItem = UIBarButtonItem (barButtonSystemItem: UIBarButtonSystemItem.done, Ziel: self, Aktion: #selector (self.doneButtonAction))
Zeezer
59
Eine Swift-3-Version ( von Markos Lösung - die für mich funktioniert hat )
( In meinem Fall habe ich ein UITextField als identifizierttextfield )
Swift 5 Lösung mit @IBInpectableund Erweiterung. Für jeden UITextField im Projekt wird unter dem Attributinspektor im Interface Builder eine Dropdown-Liste angezeigt.
Fantastische Antwort. Ich hoffe, alle scrollen hier runter.
Biomiker
1
Gute Antwort. Ich habe es in meinem Code verwendet
Firas Shrourou
15
Sie können der Tastatur eine Symbolleiste mit der Schaltfläche Fertig hinzufügen. InputAccessoryViewDie Eigenschaft des Textfelds kann zum Festlegen dieser Symbolleiste verwendet werden.
Unten ist der Code, den ich in meinem Fall verwendet habe
//Add done button to numeric pad keyboardlet toolbarDone = UIToolbar.init()
toolbarDone.sizeToFit()
let barBtnDone = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done,
target: self, action: #selector(VerifyCardViewController.doneButton_Clicked(_:)))
toolbarDone.items = [barBtnDone] // You can even add cancel button too
txtCardDetails3.inputAccessoryView = toolbarDone
Dieser Code funktioniert in iOS9 und Swift 2, ich verwende ihn in meiner App:
funcaddDoneButtonOnNumpad(textField: UITextField) {
let keypadToolbar: UIToolbar = UIToolbar()
// add a done button to the numberpad
keypadToolbar.items=[
UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder)),
UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
]
keypadToolbar.sizeToFit()
// add a toolbar with a done button above the number pad
textField.inputAccessoryView = keypadToolbar
}
Lassen Sie mich zunächst eines sagen: Sie können eine Fertig-Schaltfläche auf Ihrem Standard-Keyboard hinzufügen. Eigentlich habe ich heute gerade dieses Problem durchgearbeitet und gelöst. Ready Made Code, platzieren Sie diesen einfach in Ihrer .swift-Klasse. Ich benutze Xcode 7 und teste dies mit iPad Retina (ios 9).
Jedenfalls wird hier nicht mehr geredet, der Code.
//Creating an outlet for the textfield@IBOutletweakvar outletTextFieldTime: UITextField!//Adding the protocol of UITextFieldDelegate classReservationClass: UIViewController, UITextFieldDelegate{
functextFieldShouldBeginEditing(textField: UITextField) -> Bool {
//Making A toolbar let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/17))
//Setting the style for the toolbar
keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent//Making the done button and calling the textFieldShouldReturn native method for hidding the keyboard.let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:"))
//Calculating the flexible Space.let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
//Setting the color of the button.
item.tintColor = UIColor .yellowColor()
//Making an object using the button and space for the toolbar let toolbarButton = [flexSpace,doneButton]
//Adding the object for toolbar to the toolbar itself
keyboardDoneButtonShow.setItems(toolbarButton, animated: false)
//Now adding the complete thing against the desired textfield
outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow
returntrue
}
//Function for hidding the keyboard.functextFieldShouldReturn(textField: UITextField) -> Bool {
self.view.endEditing(true)
returnfalse
}
}
Welches gibt mir die Lösung als ...
Noch etwas möchte ich Ihnen nur sagen, dass dies die funktionierende Lösung ist, die ich in meinem letzten Projekt verwendet habe. Ich habe dies gepostet, da für dieses Problem keine funktionierende Lösung verfügbar ist. Arbeitscode und Erklärung wie versprochen.
EDIT: -
Professioneller machen ... Wenn Sie den obigen Code befolgen, erhalten Sie auch die funktionierende Lösung, aber hier versuche ich, ihn professioneller zu gestalten. Bitte beachten Sie den Code MOD. Ich habe den vorherigen unbenutzten Code mit Anführungszeichen belassen.
Änderungen..
Erstellen eines einzelnen Schaltflächenobjekts
Festlegen der Symbolleiste
Reduzieren der Größe der zuvor erstellten Symbolleiste
Positionieren Sie die benutzerdefinierte Schaltfläche mit FlexSpace und NegativeSpace links auf dem Bildschirm.
Anschließend können Sie die ausgeführte Aktion in der textFieldDidEndEditingDelegate-Methode ausführen oder der Erweiterung einfach eine benutzerdefinierte Methode hinzufügen und diese im Selektor der festlegen doneButton.
Da die obigen Antworten in Xcode 11 und höher alt sind, wird bei der ersten ToolBar-Funktion UIToolbar()jedes Mal , wenn Sie wie hier ausgeführt
werden, eine brechende Einschränkung auf die Konsole angewendetUIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) stattdessen
Das war ein Vergnügen für mich. Einfach kopiert und am Ende der .swift-Datei eingefügt und dann verwendet: textfieldOutput.addDoneButtonOnKeyboard () in ViewDidLoad. Vielen Dank!
Sie müssen eine Codezeile in die didDinegates didFinishWithLaunching-Methode von AppDelegates einfügen und alle erforderlichen Funktionen auf alle TextFields anwenden.
import IQKeyboardManagerSwift
funcapplication(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.//Following line is all you need and it applies for all TextFieldsIQKeyboardManager.shared.enable = truereturntrue
}
Einfache und einfache Möglichkeit, die Schaltfläche "FERTIG" auf einer beliebigen Tastatur hinzuzufügen, ist das Hinzufügen einer universellen Bibliothek
Antworten:
Soweit ich weiß, können Sie die Schaltfläche Fertig auf dem Tastaturteil nicht hinzufügen. Sie müssten
inputAccessoryView
demUITextField
oder ein hinzufügenUITextView
(wenn Sie dies verwenden).Weitere Informationen finden Sie in der Dokumentation .
Bearbeiten : In dieser Frage finden Sie ein Beispiel dafür.
Edit 2 : Ähnliches Beispiel in Swift .
Bearbeiten 3 : Code aus Bearbeiten 2, da der Link möglicherweise abläuft.
override func viewDidLoad() { super.viewDidLoad() //--- add UIToolBar on keyboard and Done button on UIToolBar ---// self.addDoneButtonOnKeyboard() } //--- *** ---// func addDoneButtonOnKeyboard() { var doneToolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 50)) doneToolbar.barStyle = UIBarStyle.BlackTranslucent var flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) var done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("doneButtonAction")) var items = NSMutableArray() items.addObject(flexSpace) items.addObject(done) doneToolbar.items = items doneToolbar.sizeToFit() self.textView.inputAccessoryView = doneToolbar self.textField.inputAccessoryView = doneToolbar } func doneButtonAction() { self.textViewDescription.resignFirstResponder() }
Swift 4.2
func addDoneButtonOnKeyboard(){ let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() txtMobileNumber.inputAccessoryView = doneToolbar } @objc func doneButtonAction(){ txtMobileNumber.resignFirstResponder() }
quelle
Eine Swift-3-Version ( von Markos Lösung - die für mich funktioniert hat )
( In meinem Fall habe ich ein UITextField als identifiziert
textfield
)func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 50)) doneToolbar.barStyle = UIBarStyle.default let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(ViewController.doneButtonAction)) var items = [UIBarButtonItem]() items.append(flexSpace) items.append(done) doneToolbar.items = items doneToolbar.sizeToFit() self.textfield.inputAccessoryView = doneToolbar } func doneButtonAction() { self.textfield.resignFirstResponder() }
quelle
Swift 5 Lösung mit
@IBInpectable
und Erweiterung. Für jeden UITextField im Projekt wird unter dem Attributinspektor im Interface Builder eine Dropdown-Liste angezeigt.extension UITextField{ @IBInspectable var doneAccessory: Bool{ get{ return self.doneAccessory } set (hasDone) { if hasDone{ addDoneButtonOnKeyboard() } } } func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.inputAccessoryView = doneToolbar } @objc func doneButtonAction() { self.resignFirstResponder() } }
quelle
Sie können der Tastatur eine Symbolleiste mit der Schaltfläche Fertig hinzufügen.
InputAccessoryView
Die Eigenschaft des Textfelds kann zum Festlegen dieser Symbolleiste verwendet werden.Unten ist der Code, den ich in meinem Fall verwendet habe
//Add done button to numeric pad keyboard let toolbarDone = UIToolbar.init() toolbarDone.sizeToFit() let barBtnDone = UIBarButtonItem.init(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(VerifyCardViewController.doneButton_Clicked(_:))) toolbarDone.items = [barBtnDone] // You can even add cancel button too txtCardDetails3.inputAccessoryView = toolbarDone
quelle
Wenn Ihre
Done
Schaltfläche nur den Nummernblock schließen soll, ist es am einfachsten,resignFirstResponder
als Auswahl wie folgt aufzurufen :UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder))
Dieser Code funktioniert in iOS9 und Swift 2, ich verwende ihn in meiner App:
func addDoneButtonOnNumpad(textField: UITextField) { let keypadToolbar: UIToolbar = UIToolbar() // add a done button to the numberpad keypadToolbar.items=[ UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: textField, action: #selector(UITextField.resignFirstResponder)), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil) ] keypadToolbar.sizeToFit() // add a toolbar with a done button above the number pad textField.inputAccessoryView = keypadToolbar }
quelle
Lassen Sie mich zunächst eines sagen: Sie können eine Fertig-Schaltfläche auf Ihrem Standard-Keyboard hinzufügen. Eigentlich habe ich heute gerade dieses Problem durchgearbeitet und gelöst. Ready Made Code, platzieren Sie diesen einfach in Ihrer .swift-Klasse. Ich benutze Xcode 7 und teste dies mit iPad Retina (ios 9).
Jedenfalls wird hier nicht mehr geredet, der Code.
//Creating an outlet for the textfield @IBOutlet weak var outletTextFieldTime: UITextField! //Adding the protocol of UITextFieldDelegate class ReservationClass: UIViewController, UITextFieldDelegate { func textFieldShouldBeginEditing(textField: UITextField) -> Bool { //Making A toolbar let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/17)) //Setting the style for the toolbar keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent //Making the done button and calling the textFieldShouldReturn native method for hidding the keyboard. let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:")) //Calculating the flexible Space. let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) //Setting the color of the button. item.tintColor = UIColor .yellowColor() //Making an object using the button and space for the toolbar let toolbarButton = [flexSpace,doneButton] //Adding the object for toolbar to the toolbar itself keyboardDoneButtonShow.setItems(toolbarButton, animated: false) //Now adding the complete thing against the desired textfield outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow return true } //Function for hidding the keyboard. func textFieldShouldReturn(textField: UITextField) -> Bool { self.view.endEditing(true) return false } }
Welches gibt mir die Lösung als ...
Noch etwas möchte ich Ihnen nur sagen, dass dies die funktionierende Lösung ist, die ich in meinem letzten Projekt verwendet habe. Ich habe dies gepostet, da für dieses Problem keine funktionierende Lösung verfügbar ist. Arbeitscode und Erklärung wie versprochen.
EDIT: -
Professioneller machen ... Wenn Sie den obigen Code befolgen, erhalten Sie auch die funktionierende Lösung, aber hier versuche ich, ihn professioneller zu gestalten. Bitte beachten Sie den Code MOD. Ich habe den vorherigen unbenutzten Code mit Anführungszeichen belassen.
Änderungen..
Positionieren Sie die benutzerdefinierte Schaltfläche mit FlexSpace und NegativeSpace links auf dem Bildschirm.
func textFieldShouldBeginEditing(textField: UITextField) -> Bool { let keyboardDoneButtonShow = UIToolbar(frame: CGRectMake(200,200, self.view.frame.size.width,30)) // self.view.frame.size.height/17 keyboardDoneButtonShow.barStyle = UIBarStyle .BlackTranslucent let button: UIButton = UIButton() button.frame = CGRectMake(0, 0, 65, 20) button.setTitle("Done", forState: UIControlState .Normal) button.addTarget(self, action: Selector("textFieldShouldReturn:"), forControlEvents: UIControlEvents .TouchUpInside) button.backgroundColor = UIColor .clearColor() // let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: Selector("textFieldShouldReturn:")) let doneButton: UIBarButtonItem = UIBarButtonItem() doneButton.customView = button let negativeSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) negativeSpace.width = -10.0 let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) //doneButton.tintColor = UIColor .yellowColor() let toolbarButton = [flexSpace,doneButton,negativeSpace] keyboardDoneButtonShow.setItems(toolbarButton, animated: false) outletTextFieldTime.inputAccessoryView = keyboardDoneButtonShow return true }
Es gibt mir jetzt folgendes ... Außerdem versuche, die Bilder abzugleichen und die Änderungen zu finden.
Vielen Dank.
Hoffe das hat geholfen. Entschuldigung für die lange Antwort.
quelle
Die einfachste Lösung, die ich finden konnte - funktioniert mit Swift 4.2 - hoffe das hilft :)
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 } }
Anschließend können Sie die ausgeführte Aktion in der
textFieldDidEndEditing
Delegate-Methode ausführen oder der Erweiterung einfach eine benutzerdefinierte Methode hinzufügen und diese im Selektor der festlegendoneButton
.quelle
Da die obigen Antworten in Xcode 11 und höher alt sind, wird bei der ersten ToolBar-Funktion
UIToolbar()
jedes Mal , wenn Sie wie hier ausgeführt werden, eine brechende Einschränkung auf die Konsole angewendetUIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35))
stattdessenBeispielcode
let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) toolBar.barStyle = .default toolBar.sizeToFit() // Adding Button ToolBar let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(doneButtonTapped)) toolBar.items = [doneButton] toolBar.isUserInteractionEnabled = true textField.inputAccessoryView = toolBar
quelle
Laut Marko Nikolovski antworten
Hier ist die Antwort von Ziel C:
- (void)ViewDidLoad { [self addDoneButtonOnKeyboard]; } - (void)addDoneButtonOnKeyboard { UIToolbar *toolBarbutton = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; toolBarbutton.barStyle = UIBarStyleBlackTranslucent; UIBarButtonItem *barBtnItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonAction)]; NSMutableArray *items = [[NSMutableArray alloc] init]; [items addObject:barBtnItem]; [items addObject:done]; toolBarbutton.items = items; [toolBarbutton sizeToFit]; self.timeoutTextField.inputAccessoryView = toolBarbutton; } - (void)doneButtonAction { [self.view endEditing:YES]; }
quelle
Sie können eine benutzerdefinierte Klasse erstellen. Ich benutze Swift 4 :
class UITextFieldWithDoneButton: UITextField { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.addDoneButtonOnKeyboard() } fileprivate func addDoneButtonOnKeyboard() { let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) doneToolbar.barStyle = .default let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.doneButtonAction)) let items = [flexSpace, done] doneToolbar.items = items doneToolbar.sizeToFit() self.inputAccessoryView = doneToolbar } @objc fileprivate func doneButtonAction() { self.resignFirstResponder() } }
quelle
Ich würde eine Bibliothek namens IQKeyboardManagerSwift verwenden .
Sie müssen eine Codezeile in die didDinegates didFinishWithLaunching-Methode von AppDelegates einfügen und alle erforderlichen Funktionen auf alle TextFields anwenden.
import IQKeyboardManagerSwift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. //Following line is all you need and it applies for all TextFields IQKeyboardManager.shared.enable = true return true }
quelle
Einfache und einfache Möglichkeit, die Schaltfläche "FERTIG" auf einer beliebigen Tastatur hinzuzufügen, ist das Hinzufügen einer universellen Bibliothek
IQKeyboardManager
Fügen Sie den folgenden Code in appdelegate bei der Anwendung hinzu (_ application: UIApplication, didFinishLaunchingWithOptions.
IQKeyboardManager.shared.enable = true IQKeyboardManager.shared.enableAutoToolbar = true IQKeyboardManager.shared.keyboardDistanceFromTextField = 15 IQKeyboardManager.shared.shouldResignOnTouchOutside = true
quelle