2014-10-10 13 views
10

Sto creando un'app iOS 8 con Xcode 6.0.1 per il mio iPhone 5 (su cui è installato iOS 8.0.2). Voglio fare in modo che quando un utente fa clic sul mio UITextView, tutto il testo venga selezionato in modo che possa facilmente iniziare a digitare e cancellare quello che c'era (ma non voglio che il testo venga automaticamente cancellato perché l'utente potrebbe voler tenerlo o aggiungerlo ad esso). Per fare questo, ho il seguente codice:UITextView selectTutto il metodo non funziona come previsto

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     NSLog(@"selectedRange before: %d", textView.selectedRange.length); 
     [textView selectAll:self]; 
     NSLog(@"selectedRange after: %d", textView.selectedRange.length); 
    } 
} 

Quando questo metodo viene chiamato, l'uscita della console è quello che mi aspetto (cioè la lunghezza selectedRange è lo stesso il numero di caratteri nel testo 's la textView) . Tuttavia, nulla viene visualizzato come selezionato nello UITextView e non agisce selezionato (ad esempio non viene visualizzato alcun menu di selezione).

Ho visto più domande come questa su Internet, ma nessuna delle soluzioni fornite ha funzionato per me (e alcune di esse l'hanno scritta come un bug senza fornire alcuna soluzione). La modifica dell'id mittente su un valore diverso da self (ad esempio nil) non ha aiutato e non ha nemmeno aiutato a chiamare [textView select:self] come suggerito da una persona. Ho anche provato questo codice:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    if ([textView hasText]) { 
     UITextRange *range = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument]; 
     [textView setSelectedTextRange:range]; 
    } 
} 

Ma, ha lo stesso problema.

Qualche suggerimento?

+0

Comportamento strano. Come puoi vedere in questo video http://m.youtube.com/watch?v=iPXsVvva97E dovrebbe funzionare come questo – TMob

+0

Esattamente. Ho visto anche quel video e non riesco a capire cosa sto facendo male. –

+0

Ho lo stesso problema, hai trovato qualche correzione? –

risposta

3

La soluzione migliore che ho trovato per questo problema finora è quello di creare un custom UITextView (vale a dire creare una nuova classe che estende UITextView) e quindi implementare il metodo selectAll in questo modo:

- (void)selectAll:(id)sender { 
    [super selectAll:sender]; 
    UITextRange *selectionRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument]; 
    [self performSelector:@selector(setSelectedTextRange:) withObject:selectionRange afterDelay:0.0]; 
} 

Poi, quando si utilizza una visualizzazione testuale, si imposta il tipo sul proprio tipo di visualizzazione testo (nel codice e nello storyboard). Ora è possibile chiamare con successo il metodo selectAll ogni volta che è necessario. Suppongo che questo dovrebbe funzionare anche con UITextField, ma non l'ho ancora provato.

20

Questa soluzione funziona troppo e non richiede sottoclasse UITextView, basta mettere questa funzione sul vostro delegato:

OBIETTIVO C -

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [textView selectAll:nil]; 
    }); 
    return YES; 
} 

SWIFT 3 -

func textViewDidBeginEditing(_ textView: UITextView) { 
    DispatchQueue.main.async { 
     textView.selectAll(nil) 
    } 
} 
+4

Questa risposta è assolutamente ridicola. È anche al 100% giusto! –

4

@brentvatne ' la soluzione di s ha funzionato per me. Pubblicare la sintassi Swift in modo che le persone possano copiare e incollare in futuro.

func textViewShouldBeginEditing(textView: UITextView) -> Bool { 
    dispatch_async(dispatch_get_main_queue()) { 
     textView.selectAll(nil) 
    } 
    return true 
} 
Problemi correlati