如何使用NSTextView进行批量显示

问题描述 投票:1回答:1

我希望能够显示类似于控制台日志的视图,并具有可滚动和可选择的多行文本。

我想到的基本过程是维护一个字符串数组(称为lines),并使用换行符作为分隔符,将它们附加到textStorageNSTextView

但是要考虑一些因素,例如:

  1. 更新滚动条上的textStorage,以便它对用户无缝显示
  2. 在调整视图高度时更新textStorage
  3. 更新textStorage后保持滚动位置
  4. 处理内存不足的可能性

有人可以提供一些指导或示例来帮助我入门吗?

appkit nstextview
1个回答
0
投票

将数组中的字符串添加到NSTextStorage并为NSClipView边界原点设置动画。

- (void)appendText:(NSString*)string {
    // Add a newline, if you need to
    string = [NSString stringWithFormat:@"%@\n", string];

    // Find range
    [self.textView.textStorage replaceCharactersInRange:NSMakeRange(self.textView.textStorage.string.length, 0) withString:string];

    // Get clip view
    NSClipView *clipView = self.textView.enclosingScrollView.contentView;

    // Calculate the y position by subtracting 
    // clip view height from total document height
    CGFloat scrollTo = self.textView.frame.size.height - clipView.frame.size.height;

    // Animate bounds
    [[clipView animator] setBoundsOrigin:NSMakePoint(0, scrollTo)];
}

如果您在NSTextView中设置了弹性,则需要监视其框架变化以获得准确的结果。将frameDidChange侦听器添加到您的文本视图并在处理程序中设置动画:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Text view setup
    [_textView setPostsFrameChangedNotifications:YES];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollToBottom) name:NSViewFrameDidChangeNotification object:_textView];
}

- (void)scrollToBottom {
    NSClipView *clipView = self.textView.enclosingScrollView.contentView;
    CGFloat scrollTo = self.textView.frame.size.height - clipView.frame.size.height;
    [[clipView animator] setBoundsOrigin:NSMakePoint(0, scrollTo)];
}

在现实生活中的应用程序中,您可能需要设置某种阈值,以查看用户滚动到末端的距离是否超过行的高度。

© www.soinside.com 2019 - 2024. All rights reserved.