2015-06-22 22 views
13

Sto provando ad aggiungere un UIToolBar personalizzato a tutte le mie tastiere con la minima ripetizione. Il modo in cui lo sto facendo attualmente richiede che aggiunga il codice a tutti i miei viewDidLoads e assegni ogni delegato del campo di testo al viewController che sto usando. Ho provato a creare la mia sottoclasse UIToolBar ma trovo che non posso davvero farlo quando l'obiettivo per i miei pulsanti "Fatto" e "Annulla" è la vista di sé. Qualcuno ha qualche suggerimento per creare una barra degli strumenti facilmente riusabile? Grazie in anticipo.Aggiungi UIToolBar a tutte le tastiere (rapido)

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

sottoclasse 'UITextField'? Forse funziona anche con le estensioni. – Glorfindel

risposta

45

Grazie al suggerimento di Glorfindel e al codice di esempio di ncerezo ho risolto il problema utilizzando le estensioni.

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 
    } 
} 

Anche se ho ancora bisogno di chiamare il codice qui sotto su tutti i miei campi di testo. Sento che potrebbe esserci un modo migliore senza dover chiamare la funzione su ogni TextField, ma per ora è decisamente più riutilizzabile.

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

Ho un programma di utilità che ho usato un po 'di tempo (il porting su Swift dal Objective-C) che fa questo e un po' di più, si potrebbe trovare utile:

https://github.com/ncerezo/SwiftKeyboardAccessory

Crea una barra degli strumenti con almeno un pulsante "Fine" per chiudere la tastiera e opzionalmente i pulsanti Avanti e Precedente. Si occupa anche di ignorare la tastiera quando si tocca fuori dal campo di testo e di ridimensionare e scorrere la vista quando la tastiera appare o scompare. È progettato per funzionare con UITableVIew e anche con UIScrollView.

12

equivalente della versione Vivian in rapida 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

È possibile effettuare una sottoclasse di lavoro UIToolbar approfittando della catena responder. Non c'è bisogno di cambiare i tuoi controller di visualizzazione. 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) 
    } 
} 

quindi aggiungere il seguente al vostro applicationDidFinishLaunching applicare questo a tutti i vostri tastiere:

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