impostare un file di pennino con il layout inputView appropriato e articoli. Nel mio caso, ho impostato ciascun pulsante su un'azione su File Owner of inputViewButtonPressed
.
Impostare uno storyboard (o un pennino se si preferisce) per un controller di visualizzazione.
Poi utilizzando il seguente codice, si dovrebbe ottenere quello che stai cercando:
class ViewController: UIViewController, UITextFieldDelegate {
var myInputView : UIView!
var activeTextField : UITextField?
override func viewDidLoad() {
super.viewDidLoad()
// load input view from nib
if let objects = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil) {
myInputView = objects[0] as UIView
}
// Set up all the text fields with us as the delegate and
// using our input view
for view in self.view.subviews {
if let textField = view as? UITextField {
textField.inputView = myInputView
textField.delegate = self
}
}
}
func textFieldDidBeginEditing(textField: UITextField) {
activeTextField = textField
}
func textFieldDidEndEditing(textField: UITextField) {
activeTextField = nil
}
@IBAction func inputViewButtonPressed(button:UIButton) {
// Update the text field with the text from the button pressed
activeTextField?.text = button.titleLabel?.text
// Close the text field
activeTextField?.resignFirstResponder()
}
}
In alternativa, se hai intenzione di essere più tastiera-like, è possibile utilizzare questa funzione come la vostra azione (utilizza la nuova sintassi let da Swift 1.2), disgregare se avete bisogno di 1.1 compatibilità:
@IBAction func insertButtonText(button:UIButton) {
if let textField = activeTextField, title = button.titleLabel?.text, range = textField.selectedTextRange {
// Update the text field with the text from the button pressed
textField.replaceRange(range, withText: title)
}
}
Questo utilizza il protocollo UITextInput
per aggiornare il campo di testo a seconda dei casi.La gestione dell'eliminazione è un po 'più complicata, ma non ancora male:
@IBAction func deleteText(button:UIButton) {
if let textField = activeTextField, range = textField.selectedTextRange {
if range.empty {
// If the selection is empty, delete the character behind the cursor
let start = textField.positionFromPosition(range.start, inDirection: .Left, offset: 1)
let deleteRange = textField.textRangeFromPosition(start, toPosition: range.end)
textField.replaceRange(deleteRange, withText: "")
}
else {
// If the selection isn't empty, delete the chars in the selection
textField.replaceRange(range, withText: "")
}
}
}
Creare un file di classe personalizzato e impostarlo come classe per il tuo xib in InterfaceBuilder. Quindi è possibile trascinare ctrl dagli elementi dell'interfaccia utente al file di classe (editor di assistente) per creare IBOutlets. Usa queste uscite nel tuo codice per aggiornare gli elementi dell'interfaccia utente. – zisoft
Sono stato in grado di creare IBOutlets/IBActions per i pulsanti in customView. Questo è stato necessario ma non sufficiente per ottenere pulsanti in customView per comunicare textInput/keyboardFunctionality alla vista di TextInputs. – codycoats
le tue opinioni non devono implementare/conformarsi al protocollo corretto? (UITextInput?). potresti anche dover dire loro di diventare il primo soccorritore quando vengono toccati. Proverei la sottoclasse di UIControl contro UIView – nielsbot