2012-05-26 5 views
20

Quello che sto cercando di fare è creare qualcosa di simile alla funzione di ricerca "trova sulla pagina" in Safari su iPad.Lasciando inputAccessoryView visibile dopo che la tastiera è stata scaricata

Sto utilizzando uno UIToolbar con alcuni elementi al suo interno e lo ho collegato alla tastiera impostandolo come inputAccessoryView su UITextField. Funziona come un fascino, ma c'è una cosa che non riesco a capire. In Safari, quando cerchi qualcosa, la tastiera scompare ma la barra degli strumenti rimane nella parte inferiore dello schermo.

Qualcuno ha un indizio su come realizzare questo? L'unica soluzione a cui riesco a pensare è rispondere a un evento ignorato dalla tastiera e quindi estrarre lo UIToolBar e creare un'animazione personalizzata che lo sposti nella parte inferiore dello schermo. Ma questo è hacky. Sto cercando una soluzione più elegante. Qualcosa che possa farmi decidere cosa fare con la vista degli accessori di input quando la tastiera viene scaricata.

risposta

41

E 'fatta così:

Assegnare il tuo UIToolbar a una proprietà nel vostro controller della vista :

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar; 

nel controller vista dall'alto, aggiungere questi metodi:

- (BOOL)canBecomeFirstResponder{ 

    return YES; 

} 

- (UIView *)inputAccessoryView{ 

    return self.inputAccessoryToolbar; 

} 

E poi (opzionalmente, come di solito non dovrebbe essere necessario), ogni volta che la tastiera viene nascosta, basta chiamare:

[self becomeFirstResponder]; 

questo modo, l'inputAccessoryToolbar saranno sia di ingresso del testo vista il vostro controller della vista e del vista accessoria.

+2

Vorrei poterti dare i tuoi punti di merito per questo – zekel

+1

Questo è genio proprio qui – Adolfo

+1

Non sembra funzionare su iOS8, ottengo UIViewControllerHierarchyInconsistency, qualche idea? – MegaManX

7

ho finito con UIToolBar che non è assegnato come vista accessorio di ingresso, e far scorrere su e giù sul UIKeyboardWillShowNotification/UIKeyboardWillHideNotification

+0

Grazie, credo che questo sia l'unico modo per andare davvero. –

+1

Questo è quello che sto facendo anche io, ero venuto qui sperando che ci fosse un'altra soluzione. Non credo però :( –

+1

@BradMoore, c'è un'altra soluzione. Controlla la mia risposta – arik

2

aggiunta alla risposta @ di Arik, ecco la versione Swift:

class ViewController: UIViewController { 

    @IBOutlet var textField: UITextField!  

    // Input Accessory View 
    private var inputAccessoryToolbar: UIToolBar? 
    override func canBecomeFirstResponder() -> Bool { 
    return true 
    } 
    override var inputAccessoryView: UIView? { 
    return inputAccessoryToolbar 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50)) 
    textField.inputAccessoryView = inputAccessoryToolbar 
    } 

    // UITextFieldDelegate 
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
    becomeFirstResponder() 
    return true 
    } 
} 

Grazie per la soluzione pulita!

+0

In Swift 3/4, 'canBecomeFirstResponder' e' inputAccessoryView' ora sono proprietà invece di funzioni/metodi. – Annjawn

0

Aggiornamento a Swift 4, in base alle risposte precedenti. Se si aggiunge barra degli strumenti tramite storyboards si può fare questo

class ViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 
    @IBOutlet var toolbar: UIToolbar! 

    override var canBecomeFirstResponder: Bool { 
     get { 
      return true 
     } 
    } 

    override var inputAccessoryView: UIView { 
     get { 
      return self.toolbar 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     textField.inputAccessoryView = toolbar 
    } 
} 

In questo caso, ogni volta campo di testo si dimette primati risponditore, è di default first responder alla visualizzazione principale. Tieni presente che potresti voler abbandonare esplicitamente il primo risponditore e impostare la vista principale come primo risponditore se ci sono più elementi dell'interfaccia utente e il primo risponditore imposta automaticamente la vista indesiderata dopo la rinuncia.