2012-04-09 19 views
45

UPDATE:Come aggiungere il pulsante Fine alla tastiera?

Ho anche provato attuazione UITextViewDelegate delegato e poi fare in mio controller:

- (BOOL)textViewShouldEndEditing:(UITextView *)textView 
{ 
    [textView resignFirstResponder]; 
    return YES; 
} 

Ho anche impostato il delegato della vista testo per essere auto (istanza View Controller).

Facendo clic ancora sul pulsante Fatto inserisce solo una nuova linea :(


UPDATE:

Che cosa ho fatto finora ho implementato un UITextFieldDelegate dal mio controller della vista

.. Ho collegato la vista del testo al controller della vista tramite la presa

Quindi ho fatto:


self.myTextView.delegate = self; 

E:

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
    return YES; 
} 

Ma quando clicco su pulsante Done, si aggiunge solo una nuova linea.

Quindi ho un elemento UITextView sulla mia scena e quando un utente lo tocca, la tastiera appare e può essere modificata.

Tuttavia, non posso ignorare la tastiera.

Come posso aggiungere il pulsante Fine alla tastiera in modo che possa essere rimosso?

+7

Fare qualche ricerca prima di postare qui. Un google per "UITextField done button" restituisce molti risultati rilevanti, incluso questo http://coderslike.us/2009/03/09/dismissing-keyboard-for-uitextfield/ – joerick

+0

@joerick Ho provato il tuo link. Quando clicco sul pulsante Fine, si inserisce semplicemente una nuova riga. –

+0

Mostraci cosa hai ottenuto finora; inserisci il codice che stai utilizzando al momento, e poi possiamo vedere cosa potresti fare storto. – joerick

risposta

109

questo è abbastanza semplice :)

[textField setReturnKeyType:UIReturnKeyDone]; 

per respingere la tastiera implementare il protocollo <UITextFieldDelegate> nella tua classe, impostare

textfield.delegate = self; 

e utilizzare

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    [textField resignFirstResponder]; 
} 

o

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    return YES; 
} 
+0

Ho fatto tutto ciò e, facendo clic sul pulsante Fine, inserisco solo una nuova riga. Controlla la mia domanda aggiornata. –

+1

ciao, dovresti essere in grado di capire cosa è andato storto. codice per un UITextField e lo hai copiato per UITextView senza cambiarlo, usa un 'UITextField', implementa' 'e usa il codice che ti ho fornito :) a UITextView non puoi usare UITextFieldDelegate, naturalmente. tuttavia è possibile utilizzare il protocollo '' se si vuole rimanere fedeli alla visualizzazione testo. maggiori informazioni: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextViewDelegate_Protocol/Reference/UITextViewDelegate.html –

+0

Grazie. Ho usato UITextVieDelegate e funziona. Una domanda. È possibile consentire più linee e anche un pulsante per chiudere la tastiera? Voglio dire, è possibile avere sia i tasti return che done? –

-2

In Interface Builder sulle proprietà di textView è possibile impostare il tipo di pulsante di ritorno su Fatto.

allora avete bisogno di controllare quando si preme il tasto di ritorno utilizzando

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

Verificare se il testo == "/ n" quindi respingere la tastiera dimettendosi first responder sul textView.

14

Entra nello storyboard, seleziona il campo di testo e sotto l'ispettore degli attributi c'è un'opzione che dice "tasto invio" ... seleziona "Fatto".

Poi vai nel tuo ViewController e aggiungere:

- (IBAction)dismissKeyboard:(id)sender; 
{ 
    [textField becomeFirstResponder]; 
    [textField resignFirstResponder]; 
} 

Poi vai al tuo campo di testo, fare clic su punti vendita e link "è finita in uscita" all'azione dismissKeyboard.

+0

grazie Mike la tua risposta mi ha aiutato nella mia app. ti ho dato un voto e grazie. adrian –

1

Impostare l'opzione 'Return Key' sotto l'opzione text field nell'ispettore per il campo di testo. Quindi fare clic con il pulsante destro del mouse sul campo di testo e mentre si tiene CTRL selezionare 'Did End On Exit' e trascinarlo nel file view controllers. Questo creerà un metodo IBAction. Dare il metodo un nome e quindi immettere i seguenti valori:

[textField becomeFirstResponder]; 
[textField resignFirstResponder]; 

Il tuo metodo dovrebbe essere simile a questo:

- (IBAction)methodName:(id)sender; 
{ 
    [sender becomeFirstResponder]; 
    [sender resignFirstResponder]; 
} 
1

Ok, così anch'io ho lottato con questo problema. Attualmente sto accedendo a UITextView in un UITableViewCell (tramite Tag). Poiché utilizzo le celle prototipo, non posso utilizzare IBActions né IBOutlet come suggeriscono tutti. Invece, sto usando;

- (BOOL) textView: (UITextView *) textView shouldChangeTextInRange: (NSRange) variare replacementText: (NSString *) Testo

Questo sarà quindi fornire me con il testo ogni volta che l'utente preme un pulsante. La mia soluzione, quindi, era di ottenere il carattere ascii per la nuova linea; "/ N". Se questo è il testo che è stato inserito, vorrei dimettermi dal primo interlocutore. Per esempio;

// If the text length is 0 then the user is deleting something, so only check the ascii character if there is text to check 
if (text.length != 0) { 
    // Get the Ascii character 
    int asciiCode = [text characterAtIndex:0]; 
    // If the ascii code is /n or new line, then resign first responder 
    if (asciiCode == 10) { 
     [alertTextView resignFirstResponder]; 
     [DeviceTextView resignFirstResponder]; 
    } 
} 

Non so se qualcun altro avrà bisogno di questa soluzione hacky ma ho pensato che avevo messo là fuori nel caso qualcuno ne ha bisogno!

9

versione Swift:

In Your ViewController:

textField.returnKeyType = UIReturnKeyType.Done 
textField.delegate = self 

Dopo il ViewController

extension MyViewController: UITextFieldDelegate {   
    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     return true 
    } 
} 
0

Questo è il modo migliore per aggiungere pulsante Fine sulla tastiera

textField.returnKeyType = UIReturnKeyDone; 
10

Aggiungi UIToolBar come vista personalizzata che avrà il pulsante Fine come UIBarButtonItem in esso.

Questo è un modo più sicuro e più pulito per aggiungere il pulsante Fine a qualsiasi tipo di tastiera. Crea UIToolBar aggiungi Button Done su di esso e imposta inputAccessoryView su qualsiasi UITextField o UITextView.

UIToolbar *ViewForDoneButtonOnKeyboard = [[UIToolbar alloc] init]; 
[ViewForDoneButtonOnKeyboard sizeToFit]; 
UIBarButtonItem *btnDoneOnKeyboard = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
                   style:UIBarButtonItemStyleBordered target:self 
                   action:@selector(doneBtnFromKeyboardClicked:)]; 
[ViewForDoneButtonOnKeyboard setItems:[NSArray arrayWithObjects:btnDoneOnKeyboard, nil]]; 

myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard; 

IBAction Per pulsante Done

- (IBAction)doneBtnFromKeyboardClicked:(id)sender 
    { 
     NSLog(@"Done Button Clicked."); 

     //Hide Keyboard by endEditing or Anything you want. 
     [self.view endEditing:YES]; 
    } 

SWIFT 3

var ViewForDoneButtonOnKeyboard = UIToolbar() 
ViewForDoneButtonOnKeyboard.sizeToFit() 
var btnDoneOnKeyboard = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: #selector(self.doneBtnFromKeyboardClicked)) 
ViewForDoneButtonOnKeyboard.items = [btnDoneOnKeyboard] 
myTextField.inputAccessoryView = ViewForDoneButtonOnKeyboard 

Funzione

@IBAction func doneBtnFromKeyboardClicked (sender: Any) { 
    print("Done Button Clicked.") 
    //Hide Keyboard by endEditing or Anything you want. 
    self.view.endEditing(true) 
    } 
+0

Fantastico !!! È davvero una soluzione magnifica. – Genevios

0

Il seguente è il mio approccio, in Swift 3. Quando si fa clic su doneBtn, si invii l'evento .editingDidEndOnExit. Uso questo evento per gestire il problema di attivazione tra più campi di testo.

// My customized UITextField 
class MyTextField: UITextField { 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     // Add toolBar when keyboardType in this set. 
     let set : [UIKeyboardType] = [.numberPad, .phonePad] 
     if (set.contains(self.keyboardType)) { 
      self.addDoneToolbar() 
     } 
    } 

    // Add a toolbar with a `Done` button 
    func addDoneToolbar() { 

     let toolbar = UIToolbar() 
     let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 
     let doneBtn = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onToolBarDone)) 

     toolbar.items = [space, doneBtn] 
     toolbar.sizeToFit() 

     self.inputAccessoryView = toolbar 
    } 

    @objc func onToolBarDone() { 
     // I use `editingDidEndOnExit` to simulate the `Done` behavior 
     // on the original keyboard. 
     self.sendActions(for: .editingDidEndOnExit) 
    } 
} 
Problemi correlati