Day: June 4, 2015

Swift:カーソルを上下させて写真を表示

いちいちクリックしないでカーソルを動かしたときに写真が表示されるようにしました。

注意点は次の通り。

  • 表をdelegateで処理するクラスと接続しておく。
  • func tableViewSelectionDidChange(aNotification: NSNotification) { }の中にクリック時の処理を入れる。
  • クリックしたときIBActionでキックするようにしていた場合、tableViewSelectionDidChangeが起動された後、そのIBActionに制御が移るので処理が二重にならないように配慮しなければなりません。
    ➡️フォルダをクリックしたときにIBActionに制御を渡す処理は不要(蛇足)と判明したので、TableViewからの接続を外しました。

本例の場合、Referencing Outletsのdelegate-TableViewFolderが該当します。この接続を行わないと、func tableViewSelectionDidChange(aNotification: NSNotification) { }を定義しても、制御が渡ってきません。

スクリーンショット 2015-06-04 11.44.17参考:Cocoa OS X Bindings and Non-trivial data modelの下の方に次の記述があります。The other way to do it is to simply observe the changed selection using a non-Bindings approach, and set the new representedObject in the code that gets triggered. For example, if your master view lets the user select an item in a table view, you would set up the table view’s delegate (almost certainly already done) and implement -tableViewSelectionDidChange:. In that delegate method, query the newly-selected item and assign it to detailViewController.representedObject.

Swift:システムファイルとして除外するもの

アプリの機能に依存すると思いますが、写真ファイル以外に除外するフォルダを策定しました。

開発中のアプリは、写真があるフォルダを識別しているので、たとえばゴミ箱のような関係のないフォルダ(EXIFをrewriteできないようなフォルダ)をアクセスするとパフォーマンスが悪くなります。特にシステムフォルダや写真アプリのフォルダはネストが深く、ファイル数も多いので、これを許容するとパフォーマンスが悪くなります。

それで、次のフォルダを除外することにしました。

  • フォルダは配列で定義し、initで値を設定する必要がありました。また、letはNGだったので、varで定義しました。
  • 青文字で示したものはNSHomeDirectoryForUserで調べて下さい。
  • PhotosとiPhotoはmasterだけを使うので、ほかのフォルダは除外することにしました。
  • Photosは”写真”がpathの名称になっていますが、英語の場合は”Photos”でいいかどうか、確認が必要です。
  • このほかに、.で始まる隠しフォルダ、$で始まるゴミ箱を除去しています。
  • これらのフォルダを除外する前は永久ループにはまったように見え、使用に耐えませんでしたが、対処後はまあまあです(Photosとほぼ同等)。

var syspath:[String] = []

override init() {
syspath  = [] 
syspath.append(NSSearchPathForDirectoriesInDomains(.ApplicationDirectory, .UserDomainMask, true)[0] as! String)
syspath.append(NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0] as! String)
syspath.append(NSSearchPathForDirectoriesInDomains(.TrashDirectory, .UserDomainMask, true)[0] as! String)
syspath.append(NSSearchPathForDirectoriesInDomains(.MusicDirectory, .UserDomainMask, true)[0] as! String)
syspath.append(NSHomeDirectory()+”/Pictures/iChat Icons”)
syspath.append(NSHomeDirectory()+”/Pictures/写真 Library.photoslibrary/Previews”)
syspath.append(NSHomeDirectory()+”/Pictures/写真 Library.photoslibrary/resources”)
syspath.append(NSHomeDirectory()+”/Pictures/写真 Library.photoslibrary/Thumbnails”)
syspath.append(NSHomeDirectory()+”/Pictures/写真 Library.photoslibrary/resources”)
syspath.append(NSHomeDirectory()+”/Pictures/写真 Library.photoslibrary/Database”)

syspath.append(NSHomeDirectory()+”/Pictures/iPhoto Library.photolibrary/Previews”)
syspath.append(NSHomeDirectory()+”/Pictures/iPhoto Library.photolibrary/Thumbnails”)
syspath.append(NSHomeDirectory()+”/Pictures/iPhoto Library.photolibrary/Database”)

syspath.append(NSHomeDirectory()+”/Pictures/Photos Library.photoslibrary/Previews”)
syspath.append(NSHomeDirectory()+”/Pictures/Photos Library.photoslibrary/resources”)
syspath.append(NSHomeDirectory()+”/Pictures/Photos Library.photoslibrary/Thumbnails”)
syspath.append(NSHomeDirectory()+”/Pictures/Photos Library.photoslibrary/resources”)
syspath.append(NSHomeDirectory()+”/Pictures/Photos Library.photoslibrary/Database”)
}