Cocoa 无字符串时NSTextView更改插入点(插入符号)光标大小

Cocoa 无字符串时NSTextView更改插入点(插入符号)光标大小,cocoa,nstextview,appkit,Cocoa,Nstextview,Appkit,我正在创建一个NSTextView,我想在NSTextView为空时更改插入点的大小 插入符号光标(I-Beam/IBeam光标)的大小似乎基于NSTextView的attributedString属性上的当前字体大小属性 问题在于,由于NSTextView具有空的attributedString,因此该字符串上可能没有属性。这意味着我无法应用字体大小 但是,我可以更改typingAttributes以使fontSize正确——但是插入点光标在我开始键入之前不会更新大小 请参见以下屏幕截图: 请

我正在创建一个
NSTextView
,我想在NSTextView为空时更改插入点的大小

插入符号光标(I-Beam/IBeam光标)的大小似乎基于
NSTextView
attributedString
属性上的当前字体大小属性

问题在于,由于
NSTextView
具有空的
attributedString
,因此该字符串上可能没有属性。这意味着我无法应用字体大小

但是,我可以更改
typingAttributes
以使fontSize正确——但是插入点光标在我开始键入之前不会更新大小

请参见以下屏幕截图: 请注意,右侧的textview有一个小的插入点光标:

我开始输入,它的大小会更新:

因此,我的问题是,在初始化
NSTextView
时,是否需要在其上设置一个属性,以便将初始插入点光标设置为正确的大小?(我希望它与
键入属性
字体匹配)

编辑: @Mark Bessey提出了一个好问题--我设置键入属性的顺序是什么:

  [_textEditor setTypingAttributes:typingAttributes];
  [_textEditor setDelegate:self];

  [view addSubview:_textEditor];
  [self updateInsertionPointColor];

  [[view window] makeFirstResponder:_textEditor];
  [view setNeedsDisplay:YES];

在我的ApplicationIDFinishLaunching方法中,在一个简单的测试应用程序中执行此操作:

NSFont *font = [NSFont fontWithName:@"Marker Felt" size:24.0];
NSDictionary *attr = @{
                         NSFontAttributeName: font
                       };
[self.textView setTypingAttributes:attr];
我得到了我所期望的大的I-beam光标

这与TextEdit的功能(示例代码)基本相同,因此就设置TypingAttribute而言,看起来您没有做错任何事情


我想知道您是否在错误的时间设置了属性。什么时候设置打字属性?视图在屏幕上吗?是第一响应者吗?

在没有文本时使用更改属性

每当选择更改时,键入属性将自动重置。但是,如果添加任何更改文本属性的用户操作,则该操作应使用此方法在以后应用这些属性。更改属性的用户操作应始终设置键入属性,因为在下一次键入之前,选择中可能不会有后续更改


我遇到了同样的问题,在没有找到好的解决方案之后,我通过插入一个字符,然后在同一个周期内用空字符串替换该字符,成功地迫使NSTextView更新其指针

我是在textView中做这件事的(u:shouldChangeTextIn:replacementString:),但我想它在其他地方也可以正常工作

let attributedString = NSAttributedString(string: " ", attributes: attributes)
                    
let range = someRange
let insertLocation = range.location + range.length
textView.textStorage?.insert(attributedString, at: insertLocation)

textView.typingAttributes = attributes

textView.replaceCharacters(in: range, with: "")

谢谢你的回复,我很感激你制作了一个测试应用程序(我应该亲自做以确认)。我用显示操作顺序的相关代码编辑了我的问题
let attributedString = NSAttributedString(string: " ", attributes: attributes)
                    
let range = someRange
let insertLocation = range.location + range.length
textView.textStorage?.insert(attributedString, at: insertLocation)

textView.typingAttributes = attributes

textView.replaceCharacters(in: range, with: "")