Swift カスタム テキスト エディター (ライト バージョン) を作成しようとしていますが、iOS 8 の fontDescriptorWithSymbolicTraits のバグでスタックし、nil が返されます。Swift の回避策はありますか?
ここに小さなプロジェクト サンプルを作成しました。次のシナリオをダウンロードして実行できます。
- テキストを選択
- 「B」ボタンをクリック
- 「私」ボタンをクリック
アプリがクラッシュし、:(をfontDescriptorWithSymbolicTraits
返しますnil
private func addOrRemoveTraitWithName(traitName: String, traitValue: UInt32) {
let range = self.textEditor.selectedRange
let currentAttributesDict = self.textEditor.textStorage.attributesAtIndex(range.location, effectiveRange: nil)
let currentFont = currentAttributesDict[NSFontAttributeName]
let fontDescriptor = currentFont?.fontDescriptor()
let fontNameAttribute = fontDescriptor?.fontAttributes()[UIFontDescriptorNameAttribute]
var changedFontDescriptor: UIFontDescriptor?
if fontNameAttribute?.rangeOfString(traitName).location == NSNotFound {
let existingTraitsWithNewTrait = UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor!.symbolicTraits.rawValue | traitValue)
changedFontDescriptor = fontDescriptor?.fontDescriptorWithSymbolicTraits(existingTraitsWithNewTrait)
} else {
let existingTraitsWithoutTrait = UIFontDescriptorSymbolicTraits(rawValue: fontDescriptor!.symbolicTraits.rawValue & ~traitValue)
changedFontDescriptor = fontDescriptor?.fontDescriptorWithSymbolicTraits(existingTraitsWithoutTrait)
}
let updatedFont = UIFont(descriptor: changedFontDescriptor!, size: 0.0)
var dict = [String : AnyObject]()
dict[NSFontAttributeName] = updatedFont
self.textEditor.textStorage.beginEditing()
self.textEditor.textStorage.setAttributes(dict, range: range)
self.textEditor.textStorage.endEditing()
}
サンプルプロジェクトをざっと見てみることを強くお勧めします
どのようなオプションがありますか?
また、Apple のドキュメントでは、他のユーザーが使用していたメソッドが SDK とドキュメントから欠落していることも確認しました。
これについて他の人が言うこと: