2016-05-26 7 views
3

私のアプリ(swift、OSX、Xcode、すべての最新版)には、ユーザーが入力できるNSTextViewがあります。 NSTextViewにはリッチテキスト、グラフィックス、およびNSInspectorBarが有効になっています。画像挿入後にNSTextViewが更新されない

私はNSTextViewの内容をwebarchive形式に読み込んだり保存したりします(画像の乱れがありますが、画像を含む移植可能な形式が必要です)。

これまでのところとても良いです。細部を除いてすべてが機能します。 TextViewに画像を挿入すると、表示されません。しかし、それはそこにあります。私が保存してロードすれば、それが現れるからです。

guard let theImage = NSImage(contentsOfURL: openPanel.URL!) else { 
     showErrorMessage("Unable to load image") 
     return 
    } 
    // self.textEditor is the NSTextView 
    guard let store = self.textEditor.textStorage else { abort() } 

    let attachment = NSTextAttachment() 
    attachment.image = theImage 
    let attrString = NSAttributedString(attachment: attachment)  

    let range = self.textEditor.selectedRange() 
    store.replaceCharactersInRange(range, withAttributedString: attrString) 

私はその合理的にまっすぐ進むと思う:私は私がNSOpenPanelからイメージへのパスを取得する(NSTextViewに画像を挿入する方法ここで

だ置き換える、AttributedStringのに追加、画像を読み込みますAttributedStringのと、選択した文字

しかし何もNSTextViewに全く変化が現れていない私はwebarchiveとしてNSTextStorage内容を保存する場合:。。。

guard let store = textEditor.textStorage else { abort() } 
    let attr: [String: AnyObject] = [NSDocumentTypeDocumentAttribute: NSWebArchiveTextDocumentType] 
    let data = try store.dataFromRange(NSMakeRange(0, store.length), documentAttributes: attire) 
    //... save 'data' to DB ... 

、その後でそれらをバックリロード:

//... load 'data' from the DB ... 
    guard let store = textEditor.textStorage else { abort() } 
    let str = try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSWebArchiveTextDocumentType], documentAttributes: nil) 
    store.setAttributedString(str) 

は...画像は正確に適切な場所に表示されます。

私はこれでかなり混乱しています。誰かが私が逃しているものについてのアイデアはありますか?

動作しませんでした
let frame = self.textEditor.frame 
self.textEditor.setNeedsDisplayInRect(frame) 

を: -

はところで私が使用してリフレッシュを強制しようとしています。

アドバイスあなたに与えることができるアドバイスはありがたいです。 乾杯。 Paul

編集:補遺...私はNSTextAttachmentCellsを使いこなしていますが、彼らが働くことを期待しています。彼らはまったく異なる方法で失敗します。私はちょうどで上記画像の挿入コードを交換する場合

let cell = NSTextAttachmentCell(imageCell: theImage) 
    let txtAtt = NSTextAttachment() 
    txtAtt.attachmentCell = cell 
    let str = NSAttributedString(attachment: txtAtt) 
    let range = self.textEditor.selectedRange() 
    store.replaceCharactersInRange(range, withAttributedString: str) 

...その後の画像が挿入時にすぐに表示され、かつ正確に適切な場所でください。しかし、彼らは救われません!つまり、保存してリロードすると(上記のコードに従って)、それらはwebarchiveに含まれません。

編集^ 2: だから、上記から明らかな結論はTextAttachment に添付された画像ともTextAttachmentに取り付けられている。NSTextAttachmentCell、に添付された画像の両方を持つことです。まあ...それは動作しません。しかし、私はTextAttachmentを作成し、画像のTIFF表現のデータを渡します。 AttachmentCellも作成します。これで、挿入が表示され、保存されます。

TIFFは膨大であるという欠点しかありません。画像はメモリサイズの3倍に拡大されます。

誰でもこの作品の理由についていくつかのアイデアを提供できますか?

答えて

2

Ok - ここに解決策があります。

NSTextAttachmentCellは、テキスト添付ファイルのアイコンを描画し、そのアイコンapple docs上のマウスイベントを処理するオブジェクトのためのインタフェース...

を表します。

イメージを使用してこれらのいずれかを作成する必要があります。

NSTextAttachment

...はNSDataオブジェクトまたは順番にapple docs

だからあなたは両方を必要とする添付ファイルの内容を保持してNSFileWrapperオブジェクト、のいずれかを含む - 表示のための1 (つまり、実際のデータです)。私がTIFF(大きすぎる)を保存していた問題は、JPGまたはPNG表現を作成することによって克服することができます.PNG表現は、NSDataオブジェクトに対して非常にうまく使用できます。

extension NSImage { 
    var imagePNGRepresentation: NSData { 
     return NSBitmapImageRep(data: TIFFRepresentation!)!.representationUsingType(.NSPNGFileType, properties: [:])! 
    } 
    var imageJPGRepresentation: NSData { 
     return NSBitmapImageRep(data: TIFFRepresentation!)!.representationUsingType(.NSJPEGFileType, properties: [:])! 
    } 
} 

(これを行う方法についてhereからコメンターのおかげで):私はNSImageではを拡張することであることでした。だからここ

は、私がwebarchiveとしてこれを保存すると、私はJPGオブジェクトが一緒に保存されて見ることができます

guard let theImage = NSImage(contentsOfURL: openPanel.URL!) else { 
    showErrorMessage("Unable to load image") 
    return 
} 
guard let store = self.textEditor.textStorage else { abort() } 

let cell = NSTextAttachmentCell(imageCell: theImage) 
let txtAtt = NSTextAttachment(data: theImage.imageJPGRepresentation, ofType: kUTTypeJPEG as String) 
txtAtt.attachmentCell = cell 
let str = NSAttributedString(attachment: txtAtt) 
let range = self.textEditor.selectedRange() 
store.replaceCharactersInRange(range, withAttributedString: str) 

...実際にNSTextView(ドラムロールしてください)に画像を挿入することができるコードですHTMLの側面。

これを拡張すると、おそらく任意のデータ型(ドキュメントなど)を挿入し、セルにアイコン表示を使用できます。クール。

これが記述されているほとんどのWebページには、Cellは含まれていません。私は正直なところ、その仕組みが分からない。

乾杯。 Paul。 Paul。

+0

最終的な1つのポイント... NSTextAttachmentCellは** OSXでのみ**必要です。ドキュメント:_On OS Xでは、テキスト添付ファイルは、NSTextAttachmentCellプロトコルに準拠したセルオブジェクトを使用して、マウスイベントを描画して処理します_ – Paul

+0

私はあなたにすべて借りています –

関連する問題