2009-11-10 17 views
12

mio problema è che programmaticamente l'impostazione del selectedRange di UITextView seleziona il testo, ma non fa indicare visivamente è selezionata. Sembra un bug in OS 3.0/3.1. Ancora più importante, qualsiasi soluzione o suggerimento per ottenere la selezione da visualizzare? (esempio di progetto collegato in fondo al messaggio)UITextView selectedRange non mostrare quando impostato programatically

Come faccio a sapere che è selezionato poiché non ricevo feedback visivo? due ragioni:

  1. No cursore lampeggiante
  2. battendo un tasto qualsiasi sulla tastiera cancella il testo nel campo di selezione esistente.

Ho un UITextView in un viewcontroller che consente di modificare un valore modificabile dall'utente. Il controller dell'editor viene aperto quando viene ricevuto un doppio tocco su una riga della tabella, oppure l'utente tocca il pulsante di divulgazione dei dettagli su una riga. Il viewcontroller arriva via presentModalViewController, e nel Method Editor viewWillAppear di VC, ho iniziato la tastiera con [self.textView becomeFirstResponder];

A volte voglio iniziare l'editor con l'intero contenuto del TextView selezionato in modo che l'utente potrebbe semplicemente iniziare a digitare e sarebbe elimina i contenuti esistenti (questo perché creo nuovi elementi con titoli predefiniti quindi è quasi certo che l'utente prima cancelli l'intero contenuto del campo di testo dell'editor, quindi digita il loro titolo).

Alcune delle cose che ho già provato:

  1. impostare l'intervallo selezionato in viewDidAppear (invece di e in aggiunta a farlo in textViewDidBeginEditing).
  2. Sostituire _textView.text con una copia del testo al suo interno e quindi applicare il SelectedRange (in textViewDidBeginEditing) ... pensando che se ho a che fare con bug del framework, questo potrebbe aggirarlo.
  3. [[_textView webView] selectAll]; (private api). stesso comportamento, il testo viene selezionato senza feedback visivo.
  4. invio _textView setNeedsDisplay e setNeedsLayout.
  5. utilizzando un oggetto performSelector ... afterDelay per impostare il valore selezionato in modo che accada dopo l'uscita da textViewDidBeginEditing.

arbitri su S.O .:Here e here

// UITextFieldDelegate Methods... 
- (void)textViewDidBeginEditing:(UITextView *)_textView 
{ 
NSInteger len = [_textView.text length]; 

if(self.selectInitialText){ 
    //NOTE: this is not working as expected. Indeed the text is 
    // selected but the highlighting of the text isn't showing. 
    _textView.selectedRange = NSMakeRange(0,len); 
} 
} 

- EDIT -
Ecco il progetto di esempio presentato ad Apple BugReporter.Download BugReport_7380723 sample project

Informazioni aggiuntive:

Durante la creazione e giocare con la presentazione del progetto di esempio, ho scoperto due cose:

  • quando non c'è testo selezionato, ma non clou visualizzato, toccare alcuni tasti poi " scuotere per annullare "e il testo originale viene ripristinato ma IS evidenziato.

  • Se si effettua manualmente una selezione nel TextView, quindi toccare il "Seleziona tutto" pulsante [si riferisce al progetto di esempio linkato sopra], viene selezionato tutto il testo E visualizza l'evidenziazione correttamente.

risposta

0

Soluzione temporanea: ciò che si desidera è la funzionalità di segnaposto di UITextView. Questo ovviamente non esiste. Tuttavia, ci sono alcune soluzioni alternative here

+0

Grazie per il suggerimento di soluzione alternativa. Ma in realtà non è un segnaposto in questo caso. Ho un'entità con un "titolo" modificabile specifico; un segnaposto scompare quando il campo "apre" per la modifica. Il mio testo dovrebbe rimanere ma indicare che è selezionato e quindi un'azione di tastiera sostituirà la selezione, oppure devono toccare il campo per terminare la selezione. Inoltre, un widget di qualsiasi tipo che supporti le selezioni, dovrebbe indicare lo stato selezionato, quindi questo è probabilmente un bug (ho archiviato un bug report subito dopo la pubblicazione qui). Sono più interessato a soluzioni alternative che consentono di visualizzare la selezione. grazie. – wkw

4

Risponderò alla mia domanda per ora e aggiornarlo più tardi quando ci sono più informazioni (o se qualcun altro trova un lavoro adatto in giro, passerò felicemente l'assegno alla loro risposta) . Ho un bug report in apple e dopo aver inviato il codice di esempio, è seduto lì con lo stato aperto. Sono abbastanza fiducioso che sia un bug, quindi quando riceverò una risposta da loro, passerò qui.

+2

Mai sentito? :) – antsyawn

+0

Hai sentito? – Legolas

+0

Sto selezionando la risposta di @ Zac visto che almeno un'altra persona sembra averlo confermato, ma non ho avuto l'opportunità di testare. – wkw

16

Prima di impostare la selezione a livello di codice su TextView, basta chiamare select per farlo visualizzare visivamente la nuova selezione. Per esempio:

[textView select:self]; 
textView.selectedRange = newSelectedRange; 
+0

funziona. chiamando select prima setSelectedRange rende visibile lo sfondo blu e 'lollypops'. Se si omette la chiamata selezionata, il testo selezionato verrà selezionato, ma senza gli indicatori di selezione –

1

certo punto si incontreranno questa domanda. Ho avuto lo stesso problema fino a quando non controllo l'intestazione di dichiarazione di NSObject. Hanno già fornito una funzione denominata selectAll:

@interface NSObject(UIResponderStandardEditActions) // these methods are not implemented in NSObject 

- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2); 

@end 
Problemi correlati