NSTextView使用数组制作粗体文本

时间:2014-05-24 02:14:01

标签: objective-c arrays nsstring nstextview nsmutableattributedstring

我有一个具有以下结构的数组:

(
    [0] = (
         [0] = @"Title string"
         [1] = @"Some content string"
    )
    [1] = (
         [0] = @"Title string"
         [1] = @"Some content string"
    )
    [2] = (
         [0] = @"Title string"
         [1] = @"Some content string"
    )
    ...
)

依此类推第四次出现不同程度的再次出现。

我的目标是尝试将它们全部合并为一个字符串以显示在NSTextField中,并使每个标题字符串变为粗体。所以如果输出上面的代码看起来像这样。

<小时/> 标题字符串
一些内容字符串

标题字符串
一些内容字符串

标题字符串
一些内容字符串


我的第一个问题是如何制作单个字符串,其中某些文字是粗体;我的第二个问题是我如何获取该字符串并将其发送到NSTextField?


到目前为止,这就是我所做的。
我尝试使用NSMutableAttributedString来制作字符串:

NSMutableAttributedString *contentString = [NSMutableAttributedString alloc];

for (int i=0; i<[result count]; i++) {

    [contentString addAttribute:NSFontAttributeName
                value:[NSFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
                range:NSRangeFromString(result[i][0])];
}

但我无法弄清楚如何在字符串中附加任何其他内容,或者尝试单独打印,因为我在尝试以下内容时遇到此错误以在NSTextField中显示它。

[self->contentView setString:contentString];

将'NSMutableAttributedString *'发送到'NSString *'类型的参数的不兼容的指针类型

所以我尝试了这个,但得到了一个不同的错误

[self->contentView attributedString:contentString];

'NSTextView'没有可见的@interface声明选择器'attributedString'

2 个答案:

答案 0 :(得分:1)

管理以找到使其正常工作的方法

NSMutableAttributedString *contentString = [NSMutableAttributedString alloc];

for (int i=0; i<[result count]; i++) {    
    NSMutableAttributedString *resultString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@\n\n", result[i][0], result[i][1]]];
    NSDictionary *attributes = @{
        NSFontAttributeName : [NSFont fontWithName:@"HelveticaNeue-Bold" size:12.0]
    };
    NSString *subtitle = [NSString stringWithFormat:@"%@", result[i][0]];

    [resultString setAttributes:attributes range:NSMakeRange(0, [subtitle length])];
    [contentString appendAttributedString:resultString];
}

[self->content setString:@""];
[[self->content textStorage] appendAttributedString:contentString];

解决方案位于最后一行代码中。所有需要完成的工作不是将数据传递给setString,而是使用textStorage代替并将对象传递给它。 (我想我的术语是正确的)

Bah是的,希望这有助于将来的任何人!

答案 1 :(得分:0)

这是怎么回事......

NSMutableAttributedString *contentString = [[NSMutableAttributedString alloc] init];
for (int i = 0; i < [result count]; i++) {
    NSMutableAttributedString *resultString = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@\n\n", result[i][0], result[i][1]]];
    [resultString addAttribute:NSFontAttributeName
            value:[NSFont fontWithName:@"HelveticaNeue-Bold" size:16.0]
            range:NSRangeFromString(result[i][0])];
    [contentString appendAttributedString:resultString];
}

关于您的其他代码的一些注意事项。请务必将[NSMutableAttributedString alloc][[NSMutableAttributedString alloc] init]

等初始化相匹配

您应该意识到NSMutableAttributedString不是NSString的子类,而是NSObject,而setString:不是您可以使用的方法。

NSTextView使用insertText:设置其值。