Как перекрасить UITextView для iPhone 3.x после программного обновления данных - PullRequest
0 голосов
/ 17 сентября 2010

В моем приложении я обновляю текстовое представление программно. На самом деле я перебираю набор данных из базы данных SQLITE3 и показываю определенный текст в течение определенного времени. Затем я хотел бы показать текст из следующей записи набора данных и так далее. Я просматривал все виды форумов и Apple Doc, но не смог найти ничего подобного командам перерисовки, обновления, updateTextView или около того. Я имею дело с длинными строками, поэтому я думал, что UITextView будет лучшим способом для отображения. Однако, если бы другой класс пользовательского интерфейса, такой как UITextField или UILabel, был бы лучше и проще для достижения того, что я ищу, я бы также использовал это. Нет проблем.

Ответы [ 5 ]

2 голосов
/ 20 апреля 2012

Вы можете заставить UITextField перекрасить свой текст, установив его цвет текста:

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

Цвет не должен быть другим, он просто должен быть новым UIColor экземпляром. Код выше сделает это. Принудительное перекрашивание может быть полезно, если вы переопределили drawTextInRect: и хотите изменить внешний вид текста без изменения самого текста.

Из соображений производительности вызов [textField setNeedsDisplay] не будет перерисовываться (или вызывать drawTextInRect:), если текст не изменился.

1 голос
/ 28 октября 2013

Я боролся с обновлением многострочного UITextView самостоятельно, и я нашел решение из ответа "Фил Кальвин"

В моем случае я использовал textView.textColor = [UIColor blackColor];

Итак, вот еще один контекст, который может помочь вам в вашей задаче ...

- (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);
                              }];
                         });
      }];
}           
0 голосов
/ 17 сентября 2010

Какой именно у вас вопрос?

Вы спрашиваете, как установить текст в UITextView?Просто используйте его свойство text:

someTextView.text = @"Some Text";

Вы спрашиваете, лучше ли использовать UILabel или UITextField?Это субъективный вопрос.Это зависит от того, как разработано ваше приложение, и что наиболее удобно для представления текстовой информации.(Представление форматированного HTML в UIWebView является еще одним вариантом.)

Как только вы зададите текст любого из этих встроенных классов, он будет знать, что нужно обновить / перерисовать сам.Вам не нужно устанавливать текст, а затем запускать перерисовку или «перерисовку» вручную.

0 голосов
/ 22 сентября 2010

Хорошо, я получил решение сейчас. Как всегда, это довольно просто, как только ты умеешь :-) Похоже, что я не очень ясно понял свое первоначальное описание проблемы, вот описание функции снова: Мне нужно было, чтобы мое приложение отображало текст из базы данных SQLITE3 в UITextView и обновляло этот текст каждые 2 секунды, добавляя текст из следующей записи в БД. Поэтому моей первоначальной мыслью было сделать это в цикле выбора. С намеком на косматость в том, что представление не будет обновлено, прежде чем завершить цикл, поскольку он выполняется в одном потоке, я начал искать другое решение и придумал следующее решение на основе селектора, которое работает просто фантастически.

Решением такого программного и итеративного обновления любого объекта в пользовательском интерфейсе является метод, подобный этому

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

}

Этот метод в моем случае вызывается, когда пользователь касается кнопки UIB. Чтобы остановить расписание, необходимо отправить следующее сообщение экземпляру таймера:

        [timer invalidate];

Конечно, мне пришлось немного изменить свой код для запуска с запланированным таймером, но с точки зрения итерации приведенный выше код - это все, что вам нужно для запуска и остановки планировщика. Надеюсь, что это поможет и другим с подобной проблемой.

Приветствия, Рене

0 голосов
/ 17 сентября 2010

Работает ли [myTextView setNeedsDisplay];?Это традиционный способ сообщить iOS UIView о необходимости перерисовки.Документация UIView содержит полезную информацию об этом.

...