首页 > 其他分享 >Mac开发基础13-NSTextView(一)

Mac开发基础13-NSTextView(一)

时间:2024-08-06 16:31:34浏览次数:10  
标签:13 string NSTextView Mac let 文本 Swift textView

NSTextView 是 macOS 应用开发中相当强大的多行文本输入控件。它不仅支持文本输入和显示,还支持富文本、文本编辑、布局管理等功能。

常见 API 和基础技巧

初始化 NSTextView

程序化创建

Objective-C
// 创建一个NSScrollView作为NSTextView的容器,因为NSTextView通常需要带滚动条的容器
NSScrollView *scrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(0, 0, 400, 300)];

// 创建一个NSTextView实例
NSTextView *textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 400, 300)];

// 设置NSTextView可以编辑和选择
[textView setEditable:YES];
[textView setSelectable:YES];

// 将NSTextView添加到NSScrollView
[scrollView setDocumentView:textView];
Swift
// 创建一个NSScrollView作为NSTextView的容器,因为NSTextView通常需要带滚动条的容器
let scrollView = NSScrollView(frame: NSMakeRect(0, 0, 400, 300))

// 创建一个NSTextView实例
let textView = NSTextView(frame: NSMakeRect(0, 0, 400, 300))

// 设置NSTextView可以编辑和选择
textView.isEditable = true
textView.isSelectable = true

// 将NSTextView添加到NSScrollView
scrollView.documentView = textView

设置和获取文本内容

设置文本

Objective-C
// 设置纯文本
[textView setString:@"Hello, NSTextView!"];

// 设置富文本
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"Hello, NSTextView!" attributes:@{NSForegroundColorAttributeName: [NSColor blueColor]}];
[textView.textStorage setAttributedString:attributedText];
Swift
// 设置纯文本
textView.string = "Hello, NSTextView!"

// 设置富文本
let attributedText = NSAttributedString(string: "Hello, NSTextView!", attributes: [.foregroundColor: NSColor.blue])
textView.textStorage?.setAttributedString(attributedText)

获取文本

Objective-C
// 获取纯文本
NSString *plainText = [textView string];

// 获取富文本
NSAttributedString *attributedText = [textView attributedString];
Swift
// 获取纯文本
let plainText = textView.string

// 获取富文本
let attributedText = textView.attributedString()

文本属性和样式

设置文本属性

Objective-C
// 设置文本字体
[textView setFont:[NSFont fontWithName:@"Helvetica" size:14]];

// 设置文本颜色
[textView setTextColor:[NSColor blackColor]];

// 设置文本对齐方式
[textView setAlignment:NSTextAlignmentLeft];
Swift
// 设置文本字体
textView.font = NSFont(name: "Helvetica", size: 14)

// 设置文本颜色
textView.textColor = NSColor.black

// 设置文本对齐方式
textView.alignment = .left

编辑和选择

禁用编辑和选择

Objective-C
// 禁用编辑
[textView setEditable:NO];

// 禁用选择
[textView setSelectable:NO];
Swift
// 禁用编辑
textView.isEditable = false

// 禁用选择
textView.isSelectable = false

行间距和段落样式

设置行间距和段落样式

Objective-C
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:5.0]; // 设置行间距

NSDictionary *attributes = @{NSParagraphStyleAttributeName: paragraphStyle};
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"Hello, NSTextView!" attributes:attributes];

[textView.textStorage setAttributedString:attrString];
Swift
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 5.0 // 设置行间距

let attributes: [NSAttributedString.Key: Any] = [.paragraphStyle: paragraphStyle]
let attrString = NSAttributedString(string: "Hello, NSTextView!", attributes: attributes)

textView.textStorage?.setAttributedString(attrString)

插入和删除文本

插入文本

Objective-C
// 插入文本到末尾
[textView.textStorage appendAttributedString:[[NSAttributedString alloc] initWithString:@" More text"]];
Swift
// 插入文本到末尾
textView.textStorage?.append(NSAttributedString(string: " More text"))

删除文本

Objective-C
// 删除指定范围的文本
NSRange range = NSMakeRange(0, 5);
[textView.textStorage deleteCharactersInRange:range];
Swift
// 删除指定范围的文本
let range = NSRange(location: 0, length: 5)
textView.textStorage?.deleteCharacters(in: range)

粘贴板操作

自定义粘贴板操作

Objective-C
- (void)paste:(id)sender {
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    NSString *pasteString = [pasteboard stringForType:NSPasteboardTypeString];
    
    if ([self isValidInput:pasteString]) {
        [textView insertText:pasteString];
    } else {
        NSBeep();
    }
}

- (BOOL)isValidInput:(NSString *)input {
    // 自定义校验逻辑
    return YES;
}
Swift
override func paste(_ sender: Any?) {
    let pasteboard = NSPasteboard.general
    if let pasteString = pasteboard.string(forType: .string) {
        if isValidInput(pasteString) {
            textView.insertText(pasteString, replacementRange: textView.selectedRange())
        } else {
            NSBeep()
        }
    }
}

func isValidInput(_ input: String) -> Bool {
    // 自定义校验逻辑
    return true
}

深入探讨 NSTextView

1. NSTextView 和 NSTextStorage

NSTextView 是一个视图,它使用 NSTextStorage 来管理其内容。NSTextStorage 是一个特殊的 NSMutableAttributedString,它可以自动通知其内容的更改。

2. 用户交互与编辑行为

用户交互事件

可以通过 NSNotification 获得用户与文本视图互动的通知。

Objective-C
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:NSTextDidChangeNotification object:textView];

- (void)textDidChange:(NSNotification *)notification {
    NSTextView *changedTextView = notification.object;
    NSLog(@"Text changed: %@", changedTextView.string);
}
Swift
NotificationCenter.default.addObserver(self, selector: #selector(textDidChange(_:)), name: NSText.didChangeNotification, object: textView)

@objc func textDidChange(_ notification: Notification) {
    if let changedTextView = notification.object as? NSTextView {
        print("Text changed: \(changedTextView.string)")
    }
}

委托方法

通过实现 NSTextViewDelegate,可以对文本编辑行为进行精细控制。

Objective-C
@interface ViewController () <NSTextViewDelegate>
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    textView.delegate = self;
}

- (void)textDidChange:(NSNotification *)notification {
    NSLog(@"Text did change");
}

- (BOOL)textView:(NSTextView *)textView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(nullable NSString *)replacementString {
    // 可以在这里进行输入校验
    NSLog(@"Replacement string: %@", replacementString);
    return YES;
}

@end
Swift
class ViewController: NSViewController, NSTextViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
    }

    func textDidChange(_ notification: Notification) {
        print("Text did change")
    }

    func textView(_ textView: NSTextView, shouldChangeTextIn affectedCharRange: NSRange, replacementString: String?) -> Bool {
        // 可以在这里进行输入校验
        print("Replacement string: \(replacementString ?? "")")
        return true
    }
}

3. 自动文档保存

NSDocumentNSTextView 的一个重要配套组件,可以用于自动保存文档。

使用 NSDocument 进行自动保存

Objective-C
@implementation MyDocument

- (instancetype)init {
    self = [super init];
    if (self) {
        _textView = [[NSTextView alloc] init];
    }
    return self;
}

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
    // 返回保存文档数据
    return [[_textView string] dataUsingEncoding:NSUTF8StringEncoding];
}

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError {
    // 读取和加载文档数据
    NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [_textView setString:content];
    return YES;
}

@end
Swift
class MyDocument: NSDocument {

    var textView: NSTextView = NSTextView()

    override init() {
        super.init()
    }

    override func data(ofType typeName: String) throws -> Data {
        // 返回保存文档数据
        return textView.string.data(using: .utf8) ?? Data()
    }

    override func read(from data: Data, ofType typeName: String) throws {
        // 读取和加载文档数据
        if let content = String(data: data, encoding: .utf8) {
            textView.string = content
        }
    }
}

4. 扩展功能:代码高亮与语法检查

通过自定义 NSTextView,可以实现如代码高亮、语法检查等高级功能。

代码高亮

Objective-C
- (void)highlightSyntax {
    NSString *text = [textView string];
    NSMutableAttributedString *highlightedText = [[NSMutableAttributedString alloc] initWithString:text];

    // 添加高亮逻辑,这里只是简单演示
    NSDictionary *attributes = @{NSForegroundColorAttributeName: [NSColor redColor]};
    [highlightedText setAttributes:attributes range:NSMakeRange(0, text.length)];
    
    [textView.textStorage setAttributedString:highlightedText];
}
Swift
func highlightSyntax() {
    let text = textView.string
    let highlightedText = NSMutableAttributedString(string: text)

    // 添加高亮逻辑,这里只是简单演示
    let attributes: [NSAttributedString.Key: Any] = [.foregroundColor: NSColor.red]
    highlightedText.addAttributes(attributes, range: NSRange(location: 0, length: text.count))
    
    textView.textStorage?.setAttributedString(highlightedText)
}

5. 自动文本排版

NSTextView 结合 NSLayoutManagerNSTextContainer,可以实现复杂的文本排版和布局管理。

自定义布局

Objective-C
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:NSMakeSize(400, CGFLOAT_MAX)];

[layoutManager addTextContainer:textContainer];
textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0, 0, 400, 300) textContainer:textContainer];
[textView setHorizontallyResizable:NO];
Swift
let layoutManager = NSLayoutManager()
let textContainer = NSTextContainer(containerSize: CGSize(width: 400, height: .greatestFiniteMagnitude))

layoutManager.addTextContainer(textContainer)
textView = NSTextView(frame: NSMakeRect(0, 0, 400, 300), textContainer: textContainer)
textView.isHorizontallyResizable = false

标签:13,string,NSTextView,Mac,let,文本,Swift,textView
From: https://www.cnblogs.com/chglog/p/18345408

相关文章

  • Mac开发基础14-NSTextView(二)
    进阶使用和技巧1.扩展查找和替换功能可以自定义查找和替换功能,包括高亮查找结果、批量替换等。查找并高亮Objective-C-(void)highlightOccurrencesOfString:(NSString*)searchString{//清除之前的高亮效果[textView.layoutManagerremoveTemporaryAttribute:N......
  • Xmind2024支持多平台使用,包括Windows、Mac、iOS、等操作系统
    “Xmind2024”是Xmind公司推出的一款全新的思维导图软件,它集成了多种功能,包括智能导图、AI生成、语音输入等。这款产品旨在帮助用户更高效地整理思路,提高思维能力。让我们来了解一下Xmind2024的特点。它采用了全新的设计风格,界面简洁明了,操作便捷。同时,它还提供了丰富的模板......
  • XMind2024思维导图软件特别版+便携版Mac+win+平板
    大家好!今天我们要聊的是一款神奇的思维工具——Xmind2024。你是否常常感到思维混乱,无法集中注意力,或者在处理复杂问题时感到无从下手?如果你有以上的困扰,那么恭喜你,Xmind2024将为你打开一扇全新的大门。让我们先来看看Xmind2024的特点吧。这款产品最大的亮点在于其强大的思维导......
  • Mac开发基础11-NSTextField(一)
    NSTextField是macOS应用中常用的UI元素之一,它用于显示和输入文本。NSTextField提供了丰富的API来定制和处理用户输入。常见API和技巧1.初始化NSTextField程序化创建Objective-CNSTextField*textField=[[NSTextFieldalloc]initWithFrame:NSMakeRect(0,0,20......
  • Mac开发基础12-NSTextField(二)
    NSTextField是一个功能强大的控件,不仅可以作为简单的文本输入框,还可以实现更多高级功能。例如,支持富文本、实现自定义绘制、处理复杂的输入校验等。进阶使用和技巧1.富文本显示与编辑NSTextField支持富文本,也就是说你可以为文本设置不同的颜色、字体、大小等。设置富文本O......
  • Omnissa Horizon 8 2406 (8.13) 发布下载 - 虚拟桌面基础架构 (VDI) 和应用软件
    OmnissaHorizon82406(8.13)发布-虚拟桌面基础架构(VDI)和应用软件之前称为VMwareHorizon,通过高效、安全的虚拟桌面交付增强您的工作空间请访问原文链接:https://sysin.org/blog/omnissa-horizon-8/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgHorizon......
  • Mac开发基础09-NSViewController(一)
    NSViewController简介NSViewController是macOS应用程序中的核心类,用于管理单个视图层次结构。它提供了对视图生命周期、布局管理和内容更新的控制,并与模型数据和其他控制器进行交互,提供了高效的视图控制和管理机制。基础知识点NSViewController继承自NSResponder,它主要用......
  • Mac开发基础10-NSViewController(二)
    1.View-BasedUIUpdatesNSViewController提供了很多优化UI更新的方法。利用这些方法,你可以更有效地管理复杂视图的改变。viewWillLayout该方法在控制器的视图层次结构布局之前调用,可以在此方法中修改子视图的布局。Objective-C-(void)viewWillLayout{[superview......
  • 13. 统计各种字符数量
    题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。代码:#include<stdio.h>#include<stdlib.h>voidtest(){floatscore;printf("请输入您的分数:");scanf("%f",&score);printf("您的等级是:");if(score>......
  • Windows 和 MacOS 上安装配置ADB(安卓调试桥)_android adb工具安装 mac
    一、Android调试桥(ADB)Android调试桥(ADB)是一款多功能命令行工具,它让你能够更便捷地访问和管理Android设备。使用ADB命令,你可以轻松执行以下操作网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!在设备上安装、复制和删除文件;安装应用程序;录制设备屏幕或截......