再次将 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的主要内容,如果未能解决你的问题,请参考以下文章
NSTextAttachment 使用 textkit 时覆盖文本