2010-09-16 53 views
0

在我的应用程序中,我更新了一个textView主动式。实际上,我通过SQLITE3数据库循环访问数据集,并在特定时间显示特定文本。然后我想显示下一个数据集记录中的文本等等。我一直在浏览各种论坛和苹果文档,但找不到像repaint,refresh,updateTextView等命令。 我正在处理长字符串,为什么我认为UITextView将是最好的显示方式。但是,如果另一个UI类(如UITextField或UILabel)会更好,更容易地实现我所寻找的功能,那么我也会使用它。没问题。如何在编程式更新数据后重新绘制UITextView for iPhone 3.x

干杯,勒

回答

0

你的问题到底是什么?

你问的是如何在UITextView中设置文本?只要使用其text属性:

someTextView.text = @"Some Text"; 

你是问,如果是“更好”使用UILabelUITextField?这是一个主观问题。这取决于您的应用程序的设计方式以及呈现文本信息的最有意义。 (在UIWebView中呈现格式化的HTML是另一种选择。)

一旦设置了这些内置类中的任何一个的文本,它就会知道更新/重绘本身。您不需要设置文本,然后手动触发重绘或“重绘”。

+0

对不起,似乎我不清楚我的问题。 samkass明白了,因为我在我的UITextView上尝试了setNeedsDisplay方法。我需要做的,因为我在一个循环中读取所有的记录,其中包含我的TextBlocks反复地显示,这里的代码片段:\t \t而(sqlite3_step(selectstmt)== SQLITE_ROW) \t \t { \t \t \t自我.myText1 = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,0)]; \t \t \t \t \t \t self.myTextView1.text = self.question; \t \t \t [self.myTextView1 setNeedsDisplay]; \t \t} – renesteg 2010-09-17 06:08:15

+0

顺便说一句:setNeedsDisplay无效,回答samkass问题。只有第一个记录被显示,最后一个。即使我将setNeedsDisplay消息发送到UITextView,它也不会更新循环内的显示。 – renesteg 2010-09-17 06:16:27

+0

就像我说的,只要你有'self.myTextView1.text = self.question;','myTextView1'已经被标记为需要更新它的显示,所以'[self.myTextView1 setNeedsDisplay];'什么也不做。我想你在问什么:“当我在循环中设置”UITextField“的'text'属性时,为什么不显示更新?”答案是“UI在单个线程上运行,所以直到完成循环,它根本没有机会更新UI” – 2010-09-17 06:53:16

0

是否[myTextView setNeedsDisplay];工作?这是告诉iOS UIView它需要了解重绘本身的传统方式。 UIView documentation包含一些很好的信息。

0

好吧,我现在得到了解决方案。与往常一样,只要你知道如何,它就非常简单:-) 看起来,我对最初的问题描述并不是很清楚,这里再次描述了功能描述: 我需要我的应用程序来显示我的SQLITE3中的文本数据库放在UITextView中,并每隔2秒用DB中下一条记录的文本更新该文本。所以我最初的想法是在Select循环内完成它。随着毛茸茸的提示,视图将不会更新,在完成循环,因为它在单线程中运行之前,我开始寻找另一个解决方案,并提出了以下基于选择器的解决方案,这非常棒。

该溶液到在用户界面中的任何对象的这样的程序化和迭代更新是这样

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

的方法}

在我的情况下,调用此方法当用户触摸一个UIButton 。为了使计划停止,则需要将下列消息发送到定时器实例:

 [timer invalidate]; 

当然,我不得不改变我的代码位与计划的计时器运行,但是从迭代的角度来看,上面的代码是您需要触发并停止调度程序的所有内容。希望这也能帮助其他人也有类似的问题。

干杯,勒

2

可以强制UITextField通过设置其文本颜色重绘其文本:

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

颜色并不需要是不同的,它只是需要一个新的UIColor实例。上面的代码将做到这一点。如果您重写了drawTextInRect:并且想要更改文本的外观而不更改文本本身,则强制重绘可能很有用。

由于性能方面的原因,如果文本未更改,则调用[textField setNeedsDisplay]将不会重新绘制(或调用drawTextInRect:)。

1

我与更新多的UITextView我挣扎,我发现从"Phil Calvin"

答案的解决方案在我来说,我用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); 
           }]; 
         }); 
     }]; 
}