cocoa - 如何在 cocoa 中以编程方式切换 NSTextView 中的富文本格式

标签 cocoa toggle nstextview richtext

我想在 NSTextView 中切换富文本格式。我尝试过以下操作:

[contentView setRichText:NO];
[contentView setImportsGraphics:NO];

但是,这并没有改变 NSTextView 内容,并且仍然允许进行文本格式设置。

请告诉我在 NSTextView 中像 TextEdit 一样切换/切换富文本格式的简单方法。

我已经检查了“TextEdit”示例项目,但似乎很难从中找到可用的代码。

谢谢

最佳答案

从以下链接找到了一些帮助。

click here to see solution

根据上面链接中给出的解决方案,我为 View Controller 创建了类别,如下所示:

#define TabWidth @"TabWidth"

@interface MyViewController (Helper)

- (NSDictionary *)defaultTextAttributes:(BOOL)forRichText;
- (void)removeAttachments;
- (void)setRichText:(BOOL)flag;

@end

@implementation MyViewController (Helper)

- (NSDictionary *)defaultTextAttributes:(BOOL)forRichText {
    static NSParagraphStyle *defaultRichParaStyle = nil;
    NSMutableDictionary *textAttributes = [[[NSMutableDictionary alloc] initWithCapacity:2] autorelease];
    if (forRichText) {
        [textAttributes setObject:[NSFont userFontOfSize:0.0] forKey:NSFontAttributeName];
        if (defaultRichParaStyle == nil) {  // We do this once...
            NSInteger cnt;
            NSString *measurementUnits = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleMeasurementUnits"];
            CGFloat tabInterval = ([@"Centimeters" isEqual:measurementUnits]) ? (72.0 / 2.54) : (72.0 / 2.0);  // Every cm or half inch
            NSMutableParagraphStyle *paraStyle = [[[NSMutableParagraphStyle alloc] init] autorelease];
            [paraStyle setTabStops:[NSArray array]];    // This first clears all tab stops
            for (cnt = 0; cnt < 12; cnt++) {    // Add 12 tab stops, at desired intervals...
                NSTextTab *tabStop = [[NSTextTab alloc] initWithType:NSLeftTabStopType location:tabInterval * (cnt + 1)];
                [paraStyle addTabStop:tabStop];
                [tabStop release];
            }
            defaultRichParaStyle = [paraStyle copy];
        }
        [textAttributes setObject:defaultRichParaStyle forKey:NSParagraphStyleAttributeName];
    } else {
        NSFont *plainFont = [NSFont userFixedPitchFontOfSize:0.0];
        NSInteger tabWidth = [[NSUserDefaults standardUserDefaults] integerForKey:TabWidth];
        CGFloat charWidth = [@" " sizeWithAttributes:[NSDictionary dictionaryWithObject:plainFont forKey:NSFontAttributeName]].width;
        if (charWidth == 0) charWidth = [[plainFont screenFontWithRenderingMode:NSFontDefaultRenderingMode] maximumAdvancement].width;

        // Now use a default paragraph style, but with the tab width adjusted
        NSMutableParagraphStyle *mStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
        [mStyle setTabStops:[NSArray array]];
        [mStyle setDefaultTabInterval:(charWidth * tabWidth)];
        [textAttributes setObject:[[mStyle copy] autorelease] forKey:NSParagraphStyleAttributeName];

        // Also set the font
        [textAttributes setObject:plainFont forKey:NSFontAttributeName];
    }
    return textAttributes;
}

/* Used when converting to plain text
 */
- (void)removeAttachments {
    NSTextStorage *attrString = [contentView textStorage];
    NSUInteger loc = 0;
    NSUInteger end = [attrString length];
    [attrString beginEditing];
    while (loc < end) { /* Run through the string in terms of attachment runs */
        NSRange attachmentRange;    /* Attachment attribute run */
        NSTextAttachment *attachment = [attrString attribute:NSAttachmentAttributeName atIndex:loc longestEffectiveRange:&attachmentRange inRange:NSMakeRange(loc, end-loc)];
        if (attachment) {   /* If there is an attachment and it is on an attachment character, remove the character */
            unichar ch = [[attrString string] characterAtIndex:loc];
            if (ch == NSAttachmentCharacter) {
                if ([contentView shouldChangeTextInRange:NSMakeRange(loc, 1) replacementString:@""]) {
                    [attrString replaceCharactersInRange:NSMakeRange(loc, 1) withString:@""];
                    [contentView didChangeText];
                }
                end = [attrString length];  /* New length */
            }
            else loc++; /* Just skip over the current character... */
        }
        else loc = NSMaxRange(attachmentRange);
    }
    [attrString endEditing];
}

- (void)setRichText:(BOOL)flag {
    NSDictionary *textAttributes;

    BOOL isRichText = flag;

    if (!isRichText) [self removeAttachments];

    [contentView setRichText:isRichText];
    [contentView setUsesRuler:isRichText];    /* If NO, this correctly gets rid
                                               of the ruler if it was up */
    if (isRichText && NO)
        [contentView setRulerVisible:YES];    /* Show ruler if rich, and desired */
    [contentView setImportsGraphics:isRichText];

    textAttributes = [self defaultTextAttributes:isRichText];

    if ([[contentView textStorage] length]) {
        [[contentView textStorage] setAttributes:textAttributes range: NSMakeRange(0,[[contentView textStorage] length])];
    }
    [contentView setTypingAttributes:textAttributes];
}

@end

其中contentView是NSTextView的IBOutlet。希望这会对某人有所帮助,或者让我知道是否有人有更短的方法。

谢谢

关于cocoa - 如何在 cocoa 中以编程方式切换 NSTextView 中的富文本格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6519179/

相关文章:

javascript - ToggleMenu 删除和添加类

javascript - Jquery 显示/隐藏切换 Div 选定项

jquery - 使用 jquery 打开页面并扩展某些 div 的 href

swift - NSTableView:numberOfRows不被调用

objective-c - 如何通过 Objective-C 获取 iTunes 轨道的当前时间?

objective-c - Cocoa 应用程序中的自定义字体

objective-c - 如何使 Cocoa 中的表格 View 不可编辑

swift - 使用 Swift 将 NSTask 实时输出到 NSTextView

objective-c - append 到 NSTextView

objective-c - 增加 NSTextView 以适应内容会剪裁最后一行文本