Category: Obj.C

Swift:NSTreeControllerのメインを通過

ようやくNSTreeControllerのメインFileNodeの主要部分を通過しました。

Obj.Cをほとんどそのまま使っているのであたり前なのですが、それなりに引っかかってしまいました。問題になった箇所と対処方法は次の通りでした。最終的にこれでいいかどうか?

1. SwiftからObj.Cを参照するときの注意したいこと。

  • MesaClipper-Bridging-Headerに#import “FileNode.h”を追加する。
  • var fNode  = FileNode()でObj.Cと関連づける。
  • var wArray:[AnyObject] = fNode.CallChildren(mcBaseFolderPath)のようにObj.Cメソッドを実行する。
  • Obj.Cからは、Swiftの変数が参照できるが、SwiftからはObj.Cの変数の参照ができない(?)ようだ。

2. Obj.CからSwiftを参照するときの注意したいこと。

  • Obj.Cのclass(.m)に#import “MesaClipper-Swift.h” を組み込む。MesaClipper-Bridging-Headerでないことに注意。
  • MesaClipper *Mesa = [MesaClipper new];でSwiftと関連づける。
  • Swiftの変数を参照するとき、if ([path isEqualToString:Mesa.mcBaseFolderPath]) { のように記述する。
  • NSArrayのarrayByAddingObjectがおかしい。コンパイルエラーは出ないが、値が配列に入らない。
  • Obj.CからSwiftの変数を変更できない。すべて試していないが、少なくも配列は変更できなかった。
  • Obj.Cの変数はそのclassに定義したものをメソッドで引数としてSwiftに渡すようにすれば、Obj.CからSwiftに値を引き渡せる。

-(NSMutableArray*)CallChildren:(NSString*)filePath
var wArray:[AnyObject] = fNode.CallChildren(mcBaseFolderPath)

  • 受け渡した配列は、var filepath:String = wArray[inx] as Stringのように書けば意図通りになる。
  • SwiftとOjb.Cとの間で、Swiftで定義したグローバル変数を受け渡しでき、参照・変更のいずれもできれば、上記の問題は解決できるかもしれない。

3. nil・・・本当にわかっていないの一言。

OK if xbTreeCont.selectionIndexPath == nil { return }
OK if !xbTreeCont.selectionIndexPath { return }
NG if xbTreeCont.selectionIndexPath == nil! { return }

4. それでも残っている問題:

  • Obj.Cでは、NSTreeControllerの初期設定をapplicationDidFinishLaunchingの中で行っていました。

self.root = [[FileNode alloc] initWithPath:NSHomeDirectory()];
NSString *wFilePath = [NSHomeDirectory() stringByAppendingFormat:@”/Desktop/MesaClip”];

self.root = [[FileNode alloc] initWithPath:wFilePath];

  • Swift側に書き直したいのですが、self.root、つまり、@property (nonatomic) FileNode *root;の定義のしかたがわかりません。
  • また、3行目のinitWithPathも基本的な問題として残っています。

Obj.C:Xcode 6 beta3

Swiftの勉強をしようと考え、Xcode 6 beta3をインストールしました。

MesaClipperのbuildが通り、ちゃんと動くことを確認しました。ベータだといろいろ問題が残っているものですが、ベータとしての品質の高さは時代を感じます。Mac OS 7.5は製品版がアルファの出来で、7.5.6が出るまでダメでしたからね。

SwiftのブログやXcode 6のリリースを読んで、この先どうするか考えたいと思います。

IMG_3834

obj.C:MesaClipperの保存を上書きに変更

MesaClipperの保存機能を変更しました。

細かいバグがポロポロ見つかり、都度、修正しています。

URLを指定して読み込んだ後に色づけ編集や加工をするとき、今まで、ファイル名をつけて保存すると、その後からは.webarchiveを読み込んで、編集不可としていました。

これだと、ファイル名を保存後にさらに編集加工をしたいとき、不便です。それで、URLが有効な間は上書き保存することにし、ファイルからの読み込みはしないように変更しました。

また、フォルダを作成したあと、今までは表示ファイルを選択するようにしていたのですが、作成したフォルダを選択するように変更しました。

IMG_3831

obj.C:keyDown

本業ではないですが、Objective-Cの自学習を再開します。8月末まので2ヶ月間、かなりゆったりしたペースで勉強していきたいと思います。手始めに、未了のeventから。

-(void)keyDown:(NSEvent *)theEvent 
{                                                        
    if ([[theEvent characters] isEqualToString:@”a”])  //aが押されたとき
        keyeventBOOL =!keyeventBOOL;   //逆のBOOL値を設定する
    [self setNeedsDisplay:YES];     //表示が必要YESにする
}            

theEventのログを取ると、次のようになっています。

2014-07-07 18:00:21.078 MesaEvent1.0[8513:303] [DrawingObjectViewer keyDown:] Line=48 NSEvent:
type=KeyDown
loc=(-335,690)
time=236458.6
flags=0x10100 win=0x6000001f8300
winNum=4046
ctxt=0x0
chars=”8″
unmodchars=”8″
repeat=0
keyCode=28

これらの値は、多分、[theEvent characters]と同じようなメソッドで取れるのでしょうか。

実際のコードを書く際には、次のサイトが役立つかもしれないです。

obj.C:MesaClipper 3.8 削除(Remove)

3.8 削除(Remove)

bookmarkやフォルダをクリックしてから、削除(Remove)をくリックすると、bookmarkやフォルダを削除することができます。

一度削除してしまうとファイルやフォルダはなくなってしまいます。復元することはできません。

3.9 Java

JavaはデフォルトではOFFです。有効にしたいとき、クリックしてJava ONにします。

  •  Java Off:      Java無効 (デフォルト)
  •  Java ON:      Java有効

webサイトによっては、JavaがONになっていることを前提にしているものがあります。

調査した結果では、Javaを有効にした場合、cookieによるトラッキングが多くなり、セキュリティリスクが高くなります。プライバシー対策にまとめてあります。ご参照ください。

3.10 Reload

webページを再読み込みします。

3.11 前のページ/次のページ

以前参照したページの内容がキャッシュに残っているとき、前のページに戻ったり、次のページに進んだりすることができます。

 

3.12 広告

広告のエリアです。現在、未使用。

 

3.13 メッセージ

メッセージエリアとして確保してあります。将来はアラートに変更予定です。

obj.C:MesaClipper 3.6 URL

3.6 URL

URL欄にURLを入力します。

正しいURLであれば、Webサイトが表示され、リンクステータスがグリーンになります。このあと、編集・加工したり、そのまま保存することができます。

 

3.7 URL書き換え

URL欄にローカルファイルに保存した.webarchiveファイルのリンクを指定したとき、そのままではMesaClipperで保存できません。これは.webarchiveファイルと元々のURLとのリンクがMesaClipperで認識できないためです。

たとえば、こうした事象はScrapBookのリンクをコピーしたときに起きます。

URL書き換え機能を使えば、一旦保存されたbookmarkの編集・加工内容をキープしたまま、URLを書き換え、MesaClipperの保存ファイルに変更することができます。

① .webarchiveファイルをURL欄に入力してreturnを押します。この例の場合、file:///Users/hk/Dropbox/HK%20Scrapbook/data/20140127075634/index.htmlというローカルファイルの内容が表示されます。

スクリーンショット 2014-06-26 19.07.08

② 次に、元々のURLを右側のURL欄に入力してreturnを押します。この例の場合、この操作でhttp://qiita.com/uasi/items/80660f9aa20afaf671f3というURLが、先のローカルファイルのURLを書き換わります。このあと、bookmarkを変更します。

スクリーンショット 2014-06-26 19.07.20

③ ②の状態で、表示されているページが追加しないといけないページであるとき、操作を誤るとリンクステータスがグリーンから赤になってしまいます。その場合、もう一度、②のURLから入れ直してやればうまくいきます。表示されているページが違う場合、①からやり直す必要があります。

 

補注:編集・加工内容を維持してbookmarkを変更したいときの操作

URL書き換えは、編集・加工内容を維持してbookmarkを変更したいときにも利用できます。単純に「① URLをクリック、② bookmark名を変更」でやると、webページがリフレッシュされてしまいます。

obj.C:MesaClipper 3.5 フォルダ

3.5 フォルダ

bookmarkはフォルダに入れて管理できます。フォルダは、bookmarkと違い、リンクステータスが赤でもグリーンでも作成することができます。これは、フォルダは表示と関係なく作成し、削除できるからです。

(1)フォルダ名の入力

フォルダ名の欄に、任意の文字列を入力します。フォルダ名として使えない文字があっても、自動的に変換してbookmarkとして利用できるように処理されます。ただし、同じ並びの文字列をフォルダ名として使うことはできません。

(2) フォルダ名の変更

現在、フォルダを変更することができません。変更したい場合、新しくフォルダを作成し、その中にbookmarkを新たに作成し、元のbookmarkを削除してください。

(3) bookmarkの削除(Remove)

ツリーの中のフォルダを選択して、削除(Remove)をクリックします。

削除すると元に戻すことができなくなります。

フォルダを削除すると、フォルダ内のファイルもすべて削除されます。

 

補注1:MesaClipフォルダについて

MesaClipフォルダは、デフォルトでは、デスクトップに作成されます。

bookmark名.webarchiveやフォルダはMesaClipというフォルダの中に作成/保存されています。

MesaClipフォルダには、次のようなファイルがMesaClipperによって書き込まれ、参照されています。

  •  MesaArray.txt には、bookmarkやフォルダを管理するための配列情報が書き込まれます。
  • MesaClip.txtには、再開時に表示するbookmarkやMesaClipフォルダに関する情報が書き込まれます。

補注2:MesaClipフォルダの配置場所は、プログラムフォルダに変更するか、ユーザーが定義できるようにする予定です。

補注3:MesaArray.txtは、次のfficonとffIDを除く項目がsaveされています。

スクリーンショット 2014-06-26 12.24.06

 

 

 

 

 

 

 

 

補注4:MesaClip.txtには、次の項目がsaveされています。

スクリーンショット 2014-06-26 12.24.14