NSDcoument複数ファイルフォーマット
関東swift勉強会2018-01の資料です。NSDcoumentで複数のファイルフォーマットをサポートするコード周りの解説です。
NSTextFinderの使い方
以下の2つの資料を纏めて、サンプルコードを実装した。
Appleのリファレンス
NSTextFinder Magic
落穂拾い 2017/11/11
Apple Developer Center
ガイド
- Advertising Guide for News Publishers (iAd System JS|iAd Producer|iOS|macOS) マイナーチェンジ
- App Extension Programming Guide (watchOS|tvOS|iOS|macOS) マイナーチェンジ
- Apple News API Reference (iOS) マイナーチェンジ
- Configuration Profile Reference (tvOS|iOS|macOS) マイナーチェンジ
- Core Audio Overview (iOS|macOS) マイナーチェンジ
- Information Property List Key Reference (watchOS|tvOS|iOS|macOS) マイナーチェンジ
- Mobile Device Management Protocol Reference (tvOS|iOS|macOS) マイナーチェンジ
- PassKit Package Format Reference (watchOS|iOS) マイナーチェンジ
- Text Programming Guide for iOS (tvOS|iOS) マイナーチェンジ
- Wallet Developer Guide (watchOS|iOS) マイナーチェンジ
- iOS Device Compatibility Reference (iOS) マイナーチェンジ
サンプルコード
テクニカルノートとQA
- Cannot load underlying module for XCTest (iOS|Xcode Developer Tools|macOS) 初版
- HTTPS and Test Servers (watchOS|tvOS|iOS|macOS) マイナーチェンジ
- Hey Siri, How Can I Improve the Recognition of My App’s Name? (iOS) マイナーチェンジ
- Installation Failure Troubleshooting for iOS (iOS) マイナーチェンジ
- Responding to screen capture in iOS 11. (iOS) 初版
- Updating Your Apps To Support 64-bit in iOS 11 (iOS) 初版
News - Apple Developer
- New App Store Marketing Guidelines and Resources
- Get Ready for SiriKit on HomePod
- Submit Your Updated Apps for iPhone X
- Apple Pay Has Expanded to Sweden, Denmark, Finland and the United Arab Emirates
- Search Ads is Expanding to Canada, Mexico, and Switzerland
- Creating and Promoting Your AR Apps
- Update Your Apps for iPhone X
スラド: アップル
- iPhone Xは過去最高に壊れやすいとの評価
- スライドアンロックなどの特許侵害をめぐる訴訟、米連邦最高裁はSamsungの上告を受理せず
- iPhone Xのカメラ、DxOMark MobileでPixel 2に届かず
- Samsung、iPhoneユーザーの少年が成長してGalaxyに乗り換えるキャンペーン動画を公開
- iOS 11.1で環境によっては「I」を正常に入力できないバグ
- Qualcomm、AppleがQualcommの企業秘密にアクセスする際に結んだ契約に違反していたとして提訴
- Apple、iPhone Xの焼き付き防止対策をユーザー自ら行うよう求める
- iPhone X分解リポート、バッテリーは2セル、ロジックボードは2枚重ね
- iOSの「写真」アプリがブラジャーの写真を勝手に仕分けしていたことにソーシャルメディアが驚く
- iPhone/iPad、脱Qualcomm?
Cocoaからのライブ変換(LiveConversion)の変更と監視その2
進捗があった。非公開プロトコルを適応することで、ライブ変換を制御できる。
変更と監視は出来ない。TextFieldに入力中にライブ変換を一時的に無効にすることができるだけ。
プロトコルNSTextInputClient_IncrementalSearch
NTextViewのサブクラスで、NSTextInputClient_IncrementalSearchに適合しているクラスではライブ変換は無効になる。
ヘッダは以下のようになっている。
@class NSEvent;
@protocol NSTextInputClient_IncrementalSearch
- (BOOL)wouldHandleEvent:(NSEvent *)arg1;
- (unsigned long long)incrementalSearchClientGeometry;
@end
メソッドそれぞれの詳細は不明だが、wouldHandleEventではfalseを返し、incrementalSearchClientGeometryでは0を返すことで動作した。
incrementalSearchClientGeometryで0以外の場合は、変換候補のWindowが表示されなかった。
field editor
NSWindow上にNSTextFieldを複数配置した場合を考えます。この時、Textの編集が出来るNSTextFieldは常に、その内のどれか一つです。その他のNSTextFieldは、表示されているだけです。
この特徴を特性を利用して、Cocoaフレームワークでは、NSTextFieldは表示だけを行い、編集するときは同じ場所で別のオブジェクト(NSTextView)に任せるという方式を採用しています。
この別のオブジェクトは、NSWindow上のNSTextFieldで共有されており、それをField Editorと呼びます。
昔々のNextStepの時代では、CPUのパワーは今よりも貴重でした。Cocoaフレームワークには、その時代の設計の名残があります。field editorもその名残です。
このことは、先ほどのライブ変換を制御と関係があります。ライブ変換を制御するには、NSTextFieldのサブクラスだけではなくて、NSTextInputClient_IncrementalSearchに適応したNSTextViewのサブクラスを作る必要があるのです。
さらには、上記の text field を挿げ替えて、特定のTextFieldの時だけ、こちらが指定した custom field editor を使用するように指示する必要があります。
この仕組みは、以下のようになります。
class WindowController: NSWindowController, NSWindowDelegate
{
.
.
.
@objc dynamic var custumFieldEditor: MINTLIncrementalSearchFieldEditor? = nil
public func windowWillReturnFieldEditor(_ sender: NSWindow, to client: Any?) -> Any?
{
// カスタムのfieldEditorを使う
if client is MINTLIncrementalSearchField?
{
if self.custumFieldEditor == nil
{
self.custumFieldEditor = MINTLIncrementalSearchFieldEditor()
self.custumFieldEditor!.isFieldEditor = true
}
return self.custumFieldEditor
}
// デフォルトのfieldEditorを使う
return nil
}
.
.
.
}