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

Posted

技术标签:

【中文标题】再次将 textKit 从 Objective-C 转换为 Swift【英文标题】:again convert textKit from Objective-C to Swift 【发布时间】:2016-03-13 22:12:25 【问题描述】:

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

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

第一个objc,没关系,虽然被划掉的部分的font-size很小

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

现在又(不知道另一种方式)测试代码:

objc 第 1 部分:为 Range 设置字体并调用 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 部分:使用 StrikeThrough 构建字典的帮助方法 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

【问题讨论】:

【参考方案1】:

归结为 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]

【讨论】:

我先试过了。但这会导致编译错误“无法将'NSMutableDictionary'类型的值转换为预期的参数类型'[String:AnyObject]?'” 错过了getDict函数的变化 哇,现在很好 :-) 非常感谢!

以上是关于再次将 textKit 从 Objective-C 转换为 Swift的主要内容,如果未能解决你的问题,请参考以下文章

TextKit 和旁白

NSTextAttachment 使用 textkit 时覆盖文本

如何使用 TextKit(不是 NSAttributedStrings)在 UITextView 中获取属性信息

iOS7 TextKit:项目符号对齐

关于Text Kit 一些事

在objective-c中,后台线程中的重复方法是不是正确?