Come ridisegnare un UITextView per iPhone 3.x dopo l'aggiornamento dei dati a livello di codice

StackOverflow https://stackoverflow.com/questions/3730691

Domanda

Nel mio app che aggiornare un textView di programmazione. Io in realtà ciclo attraverso un set di dati da uno SQLITE3 DB e mostrano un testo specifico per un dato tempo. Poi vorrei mostrare il testo dal record successivo set di dati e così via. Sono stato navigando attraverso tutti i tipi di forum e del doc mela pure, ma non ho trovato nulla come un ridisegno, aggiornamento, updateTextView o giù di lì di comando. Mi occupo di lunghe stringhe, perché ho pensato che l'UITextView sarebbe il modo migliore per visualizzare. Tuttavia, se un altro utente di classe, come l'UITextField o UILabel sarebbe meglio e più facile da realizzare quello che sto cercando, vorrei anche usare quella. Nessun problema.

È stato utile?

Soluzione

Che cosa è esattamente la tua domanda?

Stai chiedendo come impostare il testo in un UITextView? Basta usare la sua proprietà text:

someTextView.text = @"Some Text";

Stai chiedendo se è "meglio", per usare un UILabel o UITextField? Questa è una questione soggettiva. Dipende da come la vostra applicazione è stata progettata e ciò che rende più senso per la presentazione di informazioni testuali. (Presentare formattato HTML in un UIWebView è un'altra opzione.)

Dopo aver impostato il testo di una di queste classi incorporate, si saprà di aggiornamento / ridisegnare se stessa. Non è necessario per il testo set e premere il grilletto nel ridisegno o "ridipingere" manualmente.

Altri suggerimenti

E 'possibile forzare un UITextField di ridisegnare il suo testo impostando il colore del testo:

textField.textColor = [UIColor colorWithWhite:0.0 alpha:1.0];

Il colore non ha bisogno di essere diverso, ha bisogno semplicemente di essere una nuova istanza UIColor. Il codice sopra farà questo. Forzare un ridisegno può essere utile se si dispone di drawTextInRect: sovrascritto e si desidera modificare l'aspetto del testo senza modificare il testo stesso.

Per motivi di prestazioni, chiamando [textField setNeedsDisplay] non sarà ridisegnare (o chiamata drawTextInRect:) se il testo non è stato modificato.

ero alle prese con l'aggiornamento più righe UITextView me stesso, e ho trovato una soluzione dalla risposta di "Phil Calvino"

Nel mio caso ho usato textView.textColor = [UIColor blackColor];

Quindi, ecco un po 'di contesto che possono aiutare nel vostro compito ...

- (void)textViewDidChange:(UITextView *)textView
{  
   // ... lots of code to calculate the correct autolayout constraints & content size
   [textView setContentSize:CGSizeMake(textFitSize.width, newTextContentHeight)];

   [textView.superview setNeedsUpdateConstraints];

   [UIView animateWithDuration:0.3
                     animations:^
                     {
                         // first apply the AutoLayout to resize the UITextView
                         [textView layoutIfNeeded];
                         [textView.superview layoutIfNeeded];
                     }
                     completion:^(BOOL finished)
                     {
                         // then update the text by resetting the text colour 
                         dispatch_async(dispatch_get_main_queue(), ^{

                             [textView.textColor = [UIColor blackColor];
                             [UIView animateWithDuration:0.3
                                  animations:^(void) {                                   
                                     // do not loose the keyboard
                                     [textView becomeFirstResponder];
                                  }
                                  completion:^(BOOL finished) {
                                     // move the cursor to the bottom of the text view
                                     textView.contentOffset = CGPointMake(0., textView.contentSize.height);
                              }];
                         });
      }];
}           
lavoro [myTextView setNeedsDisplay];

fa? Questo è il modo tradizionale di raccontare un iOS UIView che ha bisogno di vedere circa ridisegnare se stessa. Il UIView documentazione contiene alcune buone informazioni su questo.

Ok ho ottenuto la soluzione ora. Come sempre, è piuttosto semplice, non appena si sa come :-) A quanto pare, che non ero molto chiaro sulla mia descrizione iniziale problema, ecco la descrizione caratteristica di nuovo: Ho bisogno del mio app per visualizzare il testo da mio database SQLITE3 in un UITextView e aggiornamento che il testo ogni 2 secondi con il testo dal prossimo record nel DB. Quindi il mio pensiero iniziale era quello di farlo all'interno del ciclo Select. Con l'accenno di Shaggy, che la vista non sarà aggiornato, prima di terminare il ciclo in quanto è in esecuzione in un singolo thread, ho cominciato a cercare un'altra soluzione e si avvicinò con la seguente soluzione a base di selezione, che funziona fantastico.

La soluzione di un aggiornamento di tale programatic e iterativo di qualsiasi oggetto nell'interfaccia utente è un metodo come questo

- (IBAction)displayTextFromArray:(UIButton *)sender{
timer = [NSTimer scheduledTimerWithTimeInterval:(2.0) target:self selector:@selector(displayText) userInfo:nil repeats:YES];    

}

Questo metodo nel mio caso viene richiamato quando l'utente tocca un UIButton. Per rendere la fermata del calendario, è necessario inviare il seguente messaggio per l'istanza Timer:

        [timer invalidate];

Naturalmente ho dovuto cambiare il mio codice un po 'di correre con il timer programmato, ma dal punto di vista iterazione, il codice di cui sopra è tutto il necessario per grilletto e smettere di uno scheduler. Spero che questo aiuta gli altri con un problema simile anche.

Saluti, René

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top