Cocoa

error: 'io_user_reference_t' undeclared here (not in a function)

in

デバグ途中に突如現れた謎のエラー。

error: 'io_user_reference_t' undeclared here (not in a function)...(以下続く)

サードパーティのFrameworkをいくつかのバージョンで切り替えながらテストしていたらいつの間にかコンパイルできなくなっていました。調べてみると任意のパスにインストールしていたフレームワークのパス(FRAMEWORK_SEARCH_PATH)がどんどん追加されていくようでサーチパスがすごいことになっていました。フレームワークのバージョン毎のテストをする場合でも、ターゲットバージョンを素直に/Library/Frameworkにコピーするのが賢明かもしれません...

"行の読み込み"のそれぞれ2 やっぱり....

in

"行の読み込み"のそれぞれでCocoaでファイルの行単位での読み込みをするコードを晒してましたが(やっぱり)もっとスマートなのがありました。

NSArray* lines = [rdata componentsSeparatedByString:@"\n"];

そう、たった一行。変な位置計算なんか必要なし。なんで、気づかなかったのだろうか?

vi(m)用のCocoaキーワードファイル

in

CocoaでGUI抜きのアプリケーション開発をすることが多くなってきたのでCocoa(Objective-C)のvi(m)用キーワードファイルを作成しました。元は、シンタックス用の定義ファイル(これはどこかからダウンロードしました。出自は失念しました。気前よく提供された方ごめんなさい)で今はperlの勉強中なのでperlでやりました。

cat ~/.vim/syntax/objc.vim | \
perl -wnl -e'if (m/^syn\s+keyword\s+/) {s/^syn\s+keyword\s+\w+\b//;
  foreach (split /\s/) {print if (!m/^$/);}}'>objc_keyword

作成したキーワードファイルを${HOME}/.vimrcに、

set complete+=k~/.vim/keyword/objc_keyword

としておけば、^N/^Pでキーワード補完ができるようになります。これでタイポも減って楽になります。ビルドも以前はXcodeに戻って
実行していたのですが、最近ようやくxcodebuildoコマンドの存在に気がつきました。

xcodebuild -configuration Debug

快適です。perlはもっとスマートに書けるようになりたいですね。空行を処理するとこなんか二度手間っぽくて嫌だけど、これで用が足りるのならこれ以上突っ込めない性格です。(^^ゞ

"行の読み込み"のそれぞれ

in

プログラムを作成するにあたって、ファイルからテキストを一行ずつ読み込んで処理をするっていうのは、HelloWorldの次にやることなんですが、Cocoa(Objctive-C)でこれをやろうとして結構面倒なことに気がつきました。Cocoaではいくつアプリケーションを作成しているのですが、これまで"テキストを一行ずつ読み込んで"処理をするという場面には出くわさなかったんですね。例えば、C++(STD)では

kqueueを試す

ファイルの書き込み監視をする要件がでてきたので以前から気になっていたkqueueを試してみました。このあたりはBSD*なOSXの強みですね。

manしてみればわかるのですがインタフェースは

HotKeyでコンテクストメニュー(もうまくいかない)

in

昨日もあれやこれやいじくり回してみたがダメだった。やっているうちに、メニューを開く(展開する)というよりやっぱりコンテクストメニューの方がいいのじゃないかと思って切り替えてみたのだがマウス位置にメニューが表示されない。(表示はするけれど、常にデスクトップ左下隅に表示されます。)

NSEvent* e =
   [NSEvent mouseEventWithType:NSLeftMouseDown location:[NSEvent mouseLocation] 
     modifierFlags:NSControlKeyMask timestamp:nil windowNumber:nil context:nil 
     eventNumber:nil clickCount:1 pressure:nil];
[NSMenu popUpContextMenu:[NSApp mainMenu] withEvent:e forView:nil];

左下隅の原点に表示されるということは、NSEventの中のmouseLocationが正しくないのだと思うのですが...他にもwindowNumber:nil、forView:nilも怪しいのだけれどそもそもwindowもviewも持たないアプリだから指定のしようがないです。

コンテクストメニューについては割と情報があるのだが、ほとんどのサンプルはmouseDown:とかからのサンプルで自前でNSEventを作成している例はなかなかないですね。自分が最初の例になれれば良かったのですが、まだダメみたい。

中途半端に表示されたメニュー

in

今日一日粘ったのだが未だ解決できず。やりたいことは、Spotlightのように通常はウィンドウを持たずメニューバーにアイコンだけ表示していてホットキーを押されたときだけメニューを開くという動作なんです。

プログラムからメニューを開く

in

Cocoaプログラムから、メニューを開く(あるいは、任意のメニューアイテムを選択する)方法(アクションを実行するのではなくて)がわからない。こんなこと簡単にできると思っていたのにショック。まさか、マウスイベントをプログラムから発生させるなんてことはないよね?Carbonを使うのかな?昨日は一日、これで潰しました。はぁぁ。挫折感満々。

「大文字のG」|| 「Shift+g」か!?

in

動的にメニューを作成するアプリを作成している際に気づいたのですが、メニューショートカットを指定するkeyEquivalentメッセージ。指定するキャラクタが大文字か小文字かで意味あいが変わります。

もちろん、ドキュメントにも明記されているのですがうっかり読み飛ばしてしまい大いに悩みました。最初、"command + C"を表現するのに、

[menuItem setKeyEquivalent:@"C"];
[menuItem setKeyEquivalentModifierMask:NSCommandKeyMask];

としていたのですが、これだと"shift + command + C"となってしまうわけです。大文字のキャラクタはそれだけでshiftを指定されたことになるわけです。まあ、Cを入力するためにはshift + Cとタイプするでしょぅてことなのだろうけど...こういうことって、COBOL文化圏の人にはしっくりこないのだろうなぁ。(バリバリCOBOLの人が、趣味でCocoaなんてことないだろうけど。)

そういえば、昔、同僚に「vi(m)で最終行にジャンプするには?」って聞かれたとき、「大文字のG」って答えたことがあって同僚は「???」だったことを思い出します。あぁ、そのときはなんて察しが悪いんだろうと思ったものですが相手ときちんとコミュニケートするという意味では「shift + ジー」と答えるべきだったかなぁなどと思う次第。

ちなみに、setKeyEquivalentに大文字・小文字どちらで指定してもメニューバーに表示される時は大文字になります。(かの方もハマっていたんですね。安心。)

Scripting Bridgeについて 2

in

アプリケーションからメールボックスの受信メール一覧を作成する超簡単なサンプルを作成してみました。

適当なプロジェクトを作成しフレームワークにScriptingBredge.Frameworkを追加し、Mail.hはプロジェクトのルール設定にsdefとsdpのコマンドを追加します。後は、Mail.hをimportして準備完了。(画像参照)(もちろん、事前にコマンドで作成したMail.hをプロジェクトに組み込んでもOKです。

コンテンツの配信


Apple Store(Japan)