我正在尝试在NSTextView上编写"突出显示"功能.目前,一切都很好.您选择一系列文本,该文本的背景颜色变为黄色.但是,虽然它仍处于选中状态,但背景是所选文本的标准蓝色.在某些情况下,如何使标准选择指示器颜色不显示?
谢谢!
如何禁用NSTextView的拼写检查?特别是,自动绘制的红线.我知道Xcode中的"连续拼写检查"选项,我在与拼写检查相关的文档中找到的每个选项似乎都没有取消红线.
我试图将一个属性字符串粘贴到我的NSTextView中,但它只显示为纯文本,没有属性.我创建了我的字符串:
NSString *str = @"Parsing Directory Structure\n\n";
NSMutableAttributedString *attrstr = [[NSMutableAttributedString alloc] initWithString:str];
NSDictionary *attributes = @{
NSForegroundColorAttributeName : [NSColor blueColor],
NSFontAttributeName : [NSFont fontWithName:@"HelveticaNeue-Bold" size:20.f]
};
[attrstr setAttributes:attributes range:NSRangeFromString(str)];
[[self.textView textStorage] appendAttributedString:attrstr];
Run Code Online (Sandbox Code Playgroud)
在NSTextView上(在滚动视图内)我已经选中了"允许富文本"框,并且未选中"可编辑"框.我基本上试图像控制台输出窗口一样使用它.
我正在尝试将文本绘制到黑色背景上,我发现文本呈现方式存在一些差异.这是我的代码:
NSTextView * textView = [[NSTextView alloc] initWithFrame:NSMakeRect(0.0f, 0.0f, 500.0f, 50.0f)];
[textView setDrawsBackground:YES];
[textView setBackgroundColor:[NSColor blackColor]];
[textView setString:@"NSTextView: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."];
[textView setFont:[NSFont fontWithName:@"Helvetica" size:18.0f]];
[textView setEditable:NO];
[textView setTextColor:[NSColor whiteColor]];
[flippedView addSubview:textView];
NSTextField * textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0.0f, 50.0f, 500.0f, 50.0f)];
[textField setDrawsBackground:YES];
[textField setBackgroundColor:[NSColor blackColor]];
[textField setBordered:NO];
[textField setBezeled:NO];
[textField setStringValue:@"NSTextField: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法(或代码)来获得接近xcode的完成列表

你知道如何实现这个目标吗?
感谢致敬,
我用NSTextView和一个按钮创建了一个简单的演示应用程序,为textView提供了一个NSTextViewDelegate并添加了一个动作:
- (IBAction)actionButtonClicked:(id)sender {
NSString *oldText = [[[self.textView textStorage] string] copy];
NSString *newText = @"And... ACTION!";
[[self.textView undoManager] registerUndoWithTarget:self.textView
selector:@selector(setString:)
object:oldText];
[[self.textView undoManager] setActionName:@"ACTION"];
[self.textView setString:newText];
}
Run Code Online (Sandbox Code Playgroud)
如果我手动更改文本,撤消/重做没有问题.但是,如果我使用action方法更改文本,则undo会按预期工作,但redo不再起作用(没有任何反应),并且撤消管理器似乎被加扰...
好的 - 为了避免NSTextView的问题我创建了一个模型类,将NSTextView绑定到它并将撤消/重做移动到模型,但这显示了与以前相同的行为 - 我做错了什么 - 这应该很容易,不应该吗?
#import "GFTextStore.h"
@implementation GFTextStore
@synthesize textVal = textVal_;
-(void)changeText{
if (!undoMan_) {
undoMan_ = [[[NSApplication sharedApplication] mainWindow] undoManager];
}
NSAttributedString *oldText = [self.textVal copy];
NSString *tempStr = [[oldText string] stringByAppendingFormat:@"\n%@",[[NSCalendarDate date]description]];
NSAttributedString *newText = [[NSAttributedString alloc] initWithString:tempStr];
[self setTextVal:newText];
[undoMan_ registerUndoWithTarget:self
selector:@selector(setTextVal:)
object:oldText];
[undoMan_ setActionName:@"ACTION"]; …Run Code Online (Sandbox Code Playgroud) 我有一个NSTextView子类充当其NSTextStorage委托.我正在尝试做两件事:
我在两种不同的方法中执行此操作,这两种方法都由- (void)textStorageWillProcessEditing:(NSNotification *)notification委托回调调用.
我可以很好地进行语法突出显示,但是当附加我的答案时,插入点会跳到行的末尾,我不知道为什么.我的评估方法如下所示:
NSString *result = ..;
NSRange lineRange = [[textStorage string] lineRangeForRange:[self selectedRange]];
NSString *line = [[textStorage string] substringWithRange:lineRange];
line = [self appendResult:result toLine:line]; // appends the answer
[textStorage replaceCharactersInRange:lineRange withString:line];
Run Code Online (Sandbox Code Playgroud)
这样做会很好地追加我的结果,但问题是,如上所述,插入点会跳到最后.
我试过了:
[textStorage beginEditing]和-endEditing.我这样做了吗?我试图以最少的hackish方式做到这一点,我也不确定这是否是进行解析/突出显示的理想场所.文档让我相信这一点,但也许这是错的.
我正在为OS X制作一个小型服务器应用程序,我正在使用NSTextView来记录有关已连接客户端的一些信息.
每当我需要记录某些东西时,我就会以这种方式将新消息附加到NSTextView的文本中:
- (void)logMessage:(NSString *)message
{
if (message) {
self.textView.string = [self.textView.string stringByAppendingFormat:@"%@\n",message];
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后我想要NSTextField(或者我应该说包含它的NSClipView)向下滚动以显示其文本的最后一行(显然它应该只在最后一行不可见时滚动,事实上如果那么新行是我记录的第一行,它已经在屏幕上,因此无需向下滚动).
我该如何以编程方式执行此操作?
我正在尝试实现一个非常简单的文本编辑器,该文本编辑器应可同时NSTextView在macOS和UITextViewiOS上使用。该文本编辑器有一个工具栏按钮“分节符”,每次单击它都会在当前光标位置插入一个新节。一节应为:
在视觉上可识别为一个部分(通过在两个后续部分之间添加视觉分隔符,并可能添加一些垂直空白),
参考。用户应该能够在编辑器中看到所有部分的列表,并且通过单击该列表中的项目,文本视图应立即滚动到该部分的开头。
在另一个问题,我问怎么解决的第一个问题,不幸的是,我还没有发现在这部分的答案,但(即使是一个解决方案,仅在MacOS作品)。
但是,这个问题集中在第二个方面:
如何在我的文本视图中维护所有部分的列表,其中每个部分都能准确地引用相关文本?
此任务的复杂性在于用户可以随时复制和粘贴或简单地编辑文本的任何部分。因此,我无法保留简单的段落编号数组或类似的内容。
我曾经有一个想法是继承NSTextStorage并使用可变属性字符串数组作为其内部存储。然后,我将使用的特殊子类NSTextAttachment并将其用作文本存储中的分节符指示符。问题在于,每当用户编辑文本时,文本视图仅调用以下方法:
func replaceCharacters(in range: NSRange,
with str: String)
Run Code Online (Sandbox Code Playgroud)
和
func setAttributes(_ attrs: [NSAttributedString.Key : Any]?,
range: NSRange)
Run Code Online (Sandbox Code Playgroud)
第一种方法仅传递不带任何属性的纯字符串,第二种方法仅获取属性。这意味着在第一种方法中,我无法确定替换字符是否实际上应该是分节符,因此我无法确定此时在内部文本存储数组中的哪个位置创建新元素。
在第二种方法中,我不知道用户是否实际添加了新文本(在这种情况下,我将不得不在文本存储数组中为每个分节符属性添加一个新元素)还是用户只是更改了现有的某些属性文本(在这种情况下,先前已经创建了新的数组元素)。
我还考虑了在表视图或堆栈视图中使用多个文本视图的想法。但是,这不起作用,因为它将使用户无法选择(和删除)多个后续部分中的文本。
最后,我尝试了子类化NSLayoutManager,但是关于它的文档确实很薄,对我来说似乎是错误的地方。(毕竟,布局经理的职责是文本的布局,而不是跟踪其结构。)
我正在尝试以编程方式设置一个NSTextViewinNSScrollView并且遇到了问题。
具体来说,我无法滚动文本视图;滚动视图似乎认为“这就是全部”。当您尝试向下滚动以查看其余内容(不释放)时,结果如下:

一旦你释放,滚动视图就会反弹回来,所以这不是图形故障;它只是在框架高度剪辑文本视图。
我尝试过使用Apple 的“Text In ScrollView”文档进行试验,并且我已经尝试过setVerticallyResizable:等等。
编码:
- (void)configureValueTextView
{
NSScrollView *vfContainer = [[NSScrollView alloc] initWithFrame:(NSRect){0,0,50,50}];
vfContainer.hasVerticalScroller = YES;
vfContainer.hasHorizontalScroller = NO;
vfContainer.translatesAutoresizingMaskIntoConstraints = NO;
_valueFieldContainer = vfContainer;
vfContainer.borderType = NSLineBorder;
NSTextView *valueField = _valueField = [[NSTextView alloc] initWithFrame:(NSRect){0,0,vfContainer.contentSize}];
valueField.delegate = self;
valueField.minSize = (NSSize){0,0};
valueField.maxSize = (NSSize){FLT_MAX, FLT_MAX};
[valueField setVerticallyResizable:YES];
[valueField setHorizontallyResizable:YES];
valueField.translatesAutoresizingMaskIntoConstraints = NO;
valueField.string = _value ? _value : @"";
valueField.editable = YES;
valueField.textContainer.containerSize = (NSSize) { vfContainer.contentSize.width, …Run Code Online (Sandbox Code Playgroud) nstextview ×10
cocoa ×8
macos ×4
objective-c ×2
autocomplete ×1
colors ×1
highlight ×1
highlighting ×1
ios ×1
nsscrollview ×1
nstextfield ×1
uitextview ×1
undo-redo ×1