Sponsor Link
環境&対象
- macOS Monterey 12.1 Beta
- Xcode 13.1
- iOS 15
TextKit2 概要
機能の概要ではなく、関連 class/struct/enum をまとめてみようと思います。
# 当初は、上記の考えだったのですが、結局 Apple のドキュメントをまとめ直す形になってます・・・・
TextKit2 のドキュメントを読んでいると、AppKit から辿っても、UIKit にたどり着くことがよくあります。
これは、おそらく同一のクラス等を使用しているためだと思うので、気にしないことにしました。
Data Management
3つのクラスが登場します。関連性は以下の通りです。
classDiagram direction RL NSObject <|-- NSTextContentManager NSTextContentManager <|-- NSTextContentStorage NSTextContentStorageObserving <|-- NSTextContentStorage NSMutableAttributedString <|-- NSTextStorage NSTextContentStorage *-- NSTextStorage : textStorage class NSTextContentStorageObserving <<protocol>> NSTextContentStorageObserving
NSTextContentManager
text document を管理する抽象クラスであり、デフォルト実装も提供するクラス
NSTextContentStorage
NSTextContentManager を継承したクラス。
NSTextStorageObserving protocol にも準拠。
NSTextContentStorage は、高々1つしかサポートされない。
textStorage が値を持っている時(nil でないとき)は、attributedString プロパティは、無視される
デフォルトでは、NSTextStorage を保管要素として初期化される。
NSTextStorage
システムによって管理されている text を保管するための 基本的な仕組みを提供する。
NSMutableAttributedString の サブクラス。そのまま使っても良いし、さらにサブクラス化しても良い。
このクラスを使って、テキストと(複数の)レイアウトマネージャーが関連づけられる。
文字や属性に変更があった時には、このクラスが、変更を レイアウトマネージャに通知する(それをトリガーとして 再表示等が行われる)
注意1:どのスレッドからアクセスしても良いが、同時アクセスは1つであることを App 側が保証すること。
注意2:macOS では、characters, words, paragraphs を使ってアクセスできるが、効率良くない。すなおに、NSMutableAttributedString や NSMutableString 等を使って、character レベルの変更を行うこと。
サブクラス化して使用する時の注意
このクラスは、beginEditing, endEditing を使った変更管理や NSAttributedString の属性についての妥当性チェック、Delegate 処理、レイアウト通知もしています。
しかし、実際の AttributedString storage は、特別な管理はしていない。必要であれば、NSAttributedString の string, attributes を継承クラスで override することで管理する。
サブクラスは、replaceCharacters, setAttributes も override しなくてはいけない。これらは、実際に変更した後に、edited(_:range:changeInLength:) をコールして変更を 親クラスに通知する必要がある。
メモ
何言ってるかサッパリだと思いますが、その通りです。
内部の振る舞いの説明はなく、主要クラスの概要情報のみが提供されているだけなので、少しづつ ひもとく必要がありそうです。
まとめ:TextKit2 その1
- 対象文字列を管理する抽象クラスは、NSTextContentManager (デフォルト実装も提供)
- 対象文字列を管理する具象クラスは、NSTextContentStorage (NSTextStorageObserving にも準拠)
- 対象となる文字列を 保管してくれるのは、NSMutableAttributedString を継承した NSTextStorage
しばらく続きます。
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
Sponsor Link