再次将 textKit 从 Objective-C 转换为 Swift

again convert textKit from Objective-C to Swift

我的应用程序中使用了以下代码,通过 strikeThrough 更改文本视图中文本的状态。现在我在 Objective-C 和 Swift 中编写了一个小示例应用程序。正如您在屏幕截图中看到的那样,结果再次令人沮丧。非常欢迎任何帮助。

我只使用 TextView 并尝试使用删除线布局显示一些文本(其他样式如粗体、斜体、下划线...具有相同的结果)

第一个objc,还可以,虽然划线部分的font-size很小

现在和 Swith 一起。字体和objc一样小,但是没有删除线:-)

现在再次(不知道其他方式)测试代码:

objc 第 1 部分:设置范围的字体并调用 makeStrikeThrough()

- (void) setFont
{
    NSRange range = NSMakeRange(11, 24);
    [self makeStrikeThrough:range];
}

在swift中相同:

func setFont() {
    let range = NSMakeRange(11, 24)
    self.makeStrikeThrough(range)
}

objc 第 2 部分:删除线

- (void) makeStrikeThrough:(NSRange)selectedRange
{
    NSMutableDictionary *dict = [self getDict:selectedRange];
    [_textView.textStorage beginEditing];
    [_textView.textStorage setAttributes:dict range:selectedRange];
    [_textView.textStorage endEditing];
}

并在 Swift 中:

func makeStrikeThrough(selectedRange: NSRange) {
    let dict = self.getDict(selectedRange)
    self.textView.textStorage.beginEditing()
    textView.textStorage.setAttributes([String() : dict], range: selectedRange)
    self.textView.textStorage.endEditing()
}

objc 第 3 部分:使用删除线构建字典的帮助方法 getDict()

- (NSMutableDictionary*) getDict:(NSRange)range
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:[NSNumber numberWithInt:2] forKey:NSStrikethroughStyleAttributeName];
    return dict;
}

然后在 Swift

func getDict(range: NSRange) ->  NSMutableDictionary {
    let dict = NSMutableDictionary()
    dict[NSStrikethroughStyleAttributeName] = NSNumber(integer: NSUnderlineStyle.StyleDouble.rawValue)
    return dict
}

我试图将问题减少到根源。也许你投了我的票 ;-) 但是我需要一个解决方案...

或者我应该使用 AttributedStrings 吗?

要下载的产品

objc

swift

归结为 Swift 函数中的一行代码:

func makeStrikeThrough(selectedRange: NSRange) {
    let dict = self.getDict(selectedRange)
    self.textView.textStorage.beginEditing()
    textView.textStorage.setAttributes([String() : dict], range: selectedRange) // error
    self.textView.textStorage.endEditing()
}

应该只是 dict:

func makeStrikeThrough(selectedRange: NSRange) {
    let dict = self.getDict(selectedRange)
    self.textView.textStorage.beginEditing()
    textView.textStorage.setAttributes(dict, range: selectedRange)
    self.textView.textStorage.endEditing()
}

而且您还需要更改 getDict 函数:

func getDict() -> [String: AnyObject] {
    return [NSStrikethroughStyleAttributeName: 2]
}