2015-06-22 5 views
13

Ich versuche, eine benutzerdefinierte UIToolBar zu all meinen Tastaturen mit so wenig Wiederholungen hinzuzufügen. Die Art, wie ich es gerade mache, erfordert, dass ich den Code zu allen meinen viewDidLoads hinzufüge und jedem Delegierten des Textfelds den von mir verwendeten viewController zuweise. Ich habe versucht, meine eigene UIToolBar-Unterklasse zu erstellen, aber ich finde, dass ich das nicht wirklich tun kann, wenn das Ziel für meine Schaltflächen "Fertig" und "Abbrechen" die Selbstansicht ist. Hat jemand irgendwelche Vorschläge zum Erstellen einer leicht wiederverwendbaren Symbolleiste? Danke im Voraus.Fügen Sie UIToolBar zu allen Tastaturen hinzu (swift)

override func viewDidLoad() { 
    super.viewDidLoad() 

    var toolBar = UIToolbar() 
    toolBar.barStyle = UIBarStyle.Default 
    toolBar.translucent = true 
    toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed") 
    var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed") 
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
    toolBar.userInteractionEnabled = true 
    toolBar.sizeToFit() 

    stateField.inputAccessoryView = toolBar 
    stateField.delegate = self 
+0

Subclass 'UITextField'? Vielleicht funktioniert es auch mit Erweiterungen. – Glorfindel

Antwort

45

Dank Glorfindels Vorschlag und ncerezos Beispielcode löste ich mein Problem mit Erweiterungen.

extension UIViewController: UITextFieldDelegate{ 
    func addToolBar(textField: UITextField){ 
     var toolBar = UIToolbar() 
     toolBar.barStyle = UIBarStyle.Default 
     toolBar.translucent = true 
     toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
     var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "donePressed") 
     var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelPressed") 
     var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
     toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
     toolBar.userInteractionEnabled = true 
     toolBar.sizeToFit() 

     textField.delegate = self 
     textField.inputAccessoryView = toolBar 
    } 
    func donePressed(){ 
     view.endEditing(true) 
    } 
    func cancelPressed(){ 
     view.endEditing(true) // or do something 
    } 
} 

Obwohl ich noch den Code unten auf allen meinen Textfeldern aufrufen muss. Ich habe das Gefühl, es könnte einen besseren Weg geben, ohne die Funktion auf jedem Textfeld aufrufen zu müssen, aber im Moment ist das definitiv wiederverwendbar.

override func viewDidLoad() { 
    super.viewDidLoad() 
    addToolBar(addressField) 
} 
0

Ich habe ein Programm, das ich habe einige Zeit benutze (portiert Swift von Objective-C), die diese und ein wenig mehr der Fall ist, kann es für Sie nützlich:

https://github.com/ncerezo/SwiftKeyboardAccessory

Es erstellt eine Symbolleiste mit mindestens einer Schaltfläche "Fertig", um die Tastatur und optional die Schaltflächen Weiter und Zurück zu schließen. Es sorgt auch dafür, dass die Tastatur nicht gedrückt wird, wenn Sie außerhalb des Textfelds tippen, und wenn die Größe der Anzeige geändert oder gescrollt wird, wenn die Tastatur erscheint oder verschwindet. Es wurde entwickelt, um mit UITableView und auch mit UIScrollView zu arbeiten.

12

Äquivalent vivian Version in schnellen 3:

extension UIViewController: UITextFieldDelegate { 
    func addToolBar(textField: UITextField) { 
     let toolBar = UIToolbar() 
     toolBar.barStyle = .default 
     toolBar.isTranslucent = true 
     toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
     let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(donePressed)) 
     let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed)) 
     let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 


     toolBar.isUserInteractionEnabled = true 
     toolBar.sizeToFit() 

     textField.delegate = self 
     textField.inputAccessoryView = toolBar 
    } 

    func donePressed() { 
     view.endEditing(true) 
    } 

    func cancelPressed() { 
     view.endEditing(true) // or do something 
    } 
} 
0

Sie können eine UIToolbar Unterklasse Arbeit machen, indem die Vorteile der Responder-Kette nehmen. Sie müssen Ihre View-Controller nicht ändern. In Swift 3:

class KeyboardAccessoryToolbar: UIToolbar { 
    convenience init() { 
     self.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50)) 
     self.barStyle = .default 
     self.isTranslucent = true 
     self.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 

     let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.done)) 
     let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancel)) 
     let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
     self.items = [cancelButton, spaceButton, doneButton] 

     self.isUserInteractionEnabled = true 
     self.sizeToFit() 
    } 

    func done() { 
     // Tell the current first responder (the current text input) to resign. 
     UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) 
    } 

    func cancel() { 
     // Call "cancel" method on first object in the responder chain that implements it. 
     UIApplication.shared.sendAction(#selector(cancel), to: nil, from: nil, for: nil) 
    } 
} 

Dann fügen Sie folgendes zu Ihrem applicationDidFinishLaunching dies auf alle Ihre Tastaturen gelten:

let accessoryView = KeyboardAccessoryToolbar() 
    UITextField.appearance().inputAccessoryView = accessoryView 
    UITextView.appearance().inputAccessoryView = accessoryView 
Verwandte Themen