gpt4 book ai didi

objective-c - 引发异常 - NSTextView 委托(delegate) - textViewDidChangeSelection : notification

转载 作者:行者123 更新时间:2023-12-03 17:22:35 25 4
gpt4 key购买 nike

我正在创建我的第一个 Mac 应用程序,一个文本编辑器。它是基于文档的,Document.xib 有一个 nstextview。我已将 Document 类作为 TextView 的委托(delegate)。我正在实现该方法:

-(void)textViewDidChangeSelection:(NSNotification *)notification
{
NSRange range=self.textView.selectedRange;
NSLog(@" %@ ",[[self.textView textStorage] attributesAtIndex: range.location
effectiveRange: &range]);

我将使用 NSLog 内部的方法调用来获取所选文本的属性,并从该通知方法更新下划线按钮(按下或不)。 问题是,当应用程序运行并且我按下某个键时,会引发异常: 引发了未捕获的异常

*** -[NSConcreteTextStorage attributesAtIndex:effectiveRange:]: Range or index   
out of bounds

我尝试通过 @try: @catch: block 进行调试,似乎上面的方法总是抛出该异常。如果我更换:

range.location

(range.location-1)

仅当光标位于索引 0 时才会抛出该异常。

有谁知道发生了什么吗?

最佳答案

effectiveRange 不是该方法用来确定扫描属性范围的范围。返回时,该范围将包含属性和值与索引 attributeAtIndex 处的属性和值相同的范围(即,该方法将为范围变量分配不同的值)。

如果要将查找属性的方法所使用的范围限制为所选范围,请使用以下方法,并将 rangeLimit 设置为所选范围:

(NSDictionary *)attributesAtIndex:(NSUInteger)索引最长有效范围:(NSRangePointer)aRange inRange:(NSRange)rangeLimit

-(void)textViewDidChangeSelection:(NSNotification *)notification
{
NSRange selectedRange=self.textView.selectedRange;
NSRange effectiveRange;
if(selectedRange.length > 0) {
NSLog(@" %@ ",[[self.textView textStorage] attributesAtIndex:selectedRange.location
longestEffectiveRange:&effectiveRange inRange:selectedRange]);
}
}

当 selectedRange 长度为 0 时,该方法似乎不起作用。这就是为什么在调用它之前检查 selectedRange.length 的原因。

关于objective-c - 引发异常 - NSTextView 委托(delegate) - textViewDidChangeSelection : notification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17967334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com