2013-03-02 90 views
18

好的,我需要的应该已经很简单了。然而,我到处寻找,我不确定自己找到了一种能够100%工作的东西(这也是过去困扰我的东西)。追加到NSTextView并滚动

所以,我们在这里:

  • 我希望能够追加NSTextView
  • 追加后,NSTextView应该向下滚动(以便最新的附加内容是可见的)

相当直截了当的,是吧?

那么...有什么想法? (执行的正是这种简单的“绝招” A代码示例会比理想更...)

回答

22

交叉引用几个答案和来源(一些调整)后,这里的答案是确实工作(给_myTextViewNSTextView出口):

- (void)appendToMyTextView:(NSString*)text 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSAttributedString* attr = [[NSAttributedString alloc] initWithString:text]; 

     [[_myTextView textStorage] appendAttributedString:attr]; 
     [_myTextView scrollRangeToVisible:NSMakeRange([[_myTextView string] length], 0)]; 
    }); 
} 
+1

不要使用'_myTextView'。改用'self.myTextView'。只有在连续数百万次执行代码行时,才应使用“_myTextView”访问属性的方法。使用GCD时尤其如此,因为'self.myTextView'是线程安全的(取决于它的声明方式)。 – 2014-04-04 04:18:29

5

简单地用这样的方式:

for (NSInteger i=1; i<=100; i++) { 
    [self.textView setString:[NSString stringWithFormat:@"%@\n%@",[self.textView string],@(i)]]; 
} 

[self.textView scrollRangeToVisible:NSMakeRange([[self.textView string] length], 0)]; 
+0

这与我的方法几乎一样(除了从主线程执行'NSTextView'的技巧,根据我的经验,如果要避免小故障和各种意外行为......实际上更安全)。无论如何,谢谢你的回答! ;-) – 2013-03-02 09:54:40

+0

你使用了块,并附加了textView的文本,我重新写了它,你的比我的好。 – 2013-03-02 09:58:50

2

这里的Anoop维迪的回答迅捷的版本

extension NSTextView { 
    func append(string: String) { 
     let oldString = self.string == nil ? "" : self.string! 
     let newString = NSString(format: "%@%@", oldString, string) 
     self.string = newString 
    } 
} 
+0

我改变了语义,以便在追加时不总是添加换行符。 – Kaydell 2014-09-06 11:23:34

-1

这里有一个Swifti 解决方案:

extension NSTextView { 
    func appendString(string:String) { 
     self.string! += string 
     self.scrollRangeToVisible(NSRange(location:countElements(self.string!), length: 0)) 
    } 
} 
6

appendAttributedStringscrollToEndOfDocument可开始在OS X 10.010.6分别

extension NSTextView { 
    func append(string: String) { 
     self.textStorage?.appendAttributedString(NSAttributedString(string: string)) 
     self.scrollToEndOfDocument(nil) 
    } 
} 
+0

当由textview管理的字符串的总长度变得很长(> 100,000行)时,应该在这里担心内存管理吗?例如,从无限期增长的日志文件中添加行... – wcochran 2017-06-22 22:19:38

+0

@wcochran您需要一个自定义文本视图,只有内存中的文件范围较小。 – neoneye 2017-06-23 07:27:14