accoのcocoaお勉強サイトです

2008年10月29日水曜日

launcher

アプリケーション起動アプリを作った。(HMDT11章)
Dock簡易版て感じで機能:
  1. パネルにドラッグアンドドロップでアプリ追加
  2. クリックでアプリ起動
  3. 終了時にアイコン状態を保存して、次回起動時に引き継ぎ
1はwindowに透明ボタンを配置して、ボタンでドラッグアンドドロップのイベントを取得。
2は NSWorkspace の openFile:を使う。
3はNSUserDefaults を利用してデータのストアと取得を行う。

アプリケーションロンチは、アプリだけでなくファイルの場合は関連づけられたデフォルトアプリが起動するためにopenFile:なのか。

つづいてiPhoneアプリ。

iPhone SDKだとアプリロンチにはUIApplicationの openURL: というのが使える。
シングルアプリ起動なので、これを実行したら現在実行中のアプリは終了して、URLに対応するアプリを起動する。
ドキュメントによるとスキームとして、http:, https:, tel:, mailto: が使えるらしい。でも、ここの記事によると、sms:もいけるらしい。また、iTunesストアのアプリURLとグーグルマップのURLの場合には、それぞれ専用アプリが起動するらしい。ほんと?ということで作ってみた。



segmented control UIでスキーム切り替えて、textfieldに入力したURLを開くだけのシンプルアプリ。
(ストアはアドレス入力が面倒なので、コードに特定URL埋め込みました。)
iPhoneでやってみたら全部できました。

メールだったらサブジェクトまで、とかSMSなら本文までもURLに追加してアプリに渡せれば、
便利なアプリが作れそうかも。Photoで画像添付メール作成までできるんだから、できてもよさそうだ。





2008年10月25日土曜日

技術本ライフハック

cocoaを勉強するにあたって、あるライフハックとも呼べることをしました。
これによって、cocoaの勉強効率と意欲が格段にあがりました。

それは、分厚い技術書を数十ページの単位で切り裂くこと。
やり方は簡単で表示を切り裂いて取り払い、接着剤のついた背固めごと必要なページずつ切り離します。失敗するとページが抜けてきたりしますが、それは気にしないことが重要です。接着剤にカッターなどで切り込みをいれれば結構うまく行くと思います。わたしは章単位に手で作業したので紙が切れる場合もありました。



Pros
  • 携帯性アップでどこでも読める。特に風呂や電車で読むのに最適
  • 読み切り型なので、途中でいやにならずにがんばれる
  • 理解したら捨てればいいので死蔵しない
  • 普通のごみで捨てられる

Cons
  • 他の章への参照が多い本では機能しない
  • ときどきページが抜ける
  • 人にあげたりできない
  • 本の作者に申し訳ない。。。
やはり携帯性に優れているのが最高。いままで分厚いままの本を風呂で読もうとして何度もくじけたのですが、この薄さなら苦になりません。捨てた後でもう一回読みたくなったら、それは本物と思うことにします。リファレンス本は不向き。チュートリアル的な本が向いています。本の作者に申し訳ないと思うのだけはどうしようもないのですが、普通より活用しているということで自分への言い訳としています。

本にある種の神秘性を感じてしまうのでこういう扱いをすることに勇気がいったのですが、死蔵するよりましという思いでやってみたのがよかったです。


outline view と table view

HMDT(白) 8章を読んでいて出てきたサンプルアプリ 「PropertyListViewer」を作った。
そして、その延長でiPhone用「PropertyListViewerもどき」を作った。

「PropertyListViewer」はテキストのプロパティリストファイルを読み込んで、階層構造をoutline viewに展開するアプリ。上半分がoutline View で下半分はテキストファイルをそのまま出力するtext view。プロパティリストのデータ構造をoutline viewに展開するために内部構造に変換し、それを表示する。outline view はデータ構造に親子関係があるときの表示に便利なビューで折りたたみできる。



view自体はデータをもたず、表示のタイミングでviewがdataSourceへデータを問い合わせる。dataSource は普通はコントローラで実装される。outline view なら NSOutlineViewDataSource プロトコル、table view は NSTableDataSource、iPhoneのtableならUITableViewDataSource。

NSOutlineViewDataSourceの必須メソッドは4つ。
  • outlineView:child:ofItem:
  • outlineView:isItemExpandable:,
  • outlineView:numberOfChildrenOfItem:
  • outlineView:objectValueForTableColumn:byItem:
iPhoneのUIKitにはoutline viewはないので、table viewを使ってみる。outline view のような親子関係表現ができないし、UIKitの table view は1カラムの制約がある。しかし、あくまでも1-viewでドリルダウンしたりはしないので親子関係については、孫まで表示(親=root、子=一階層目、孫=二階層目)。それ以上は表示できない仕様です。


スクリーンキャプチャで表示しているのは、UIKit.frameworkに含まれるiPhone のソフトウェアキーボードで利用される文言for日本語のプロパティリスト(keyboard-ja.plist)。


はまったこと
  • データ構造の理解
学んだこと
  • NSDictionaryの使い方
  • outline viewとtable view 全般、概要
ところで、Xcodeのドキュメントビューアーは別アプリとして実現してほしいな。なんだか使いにくい。
そしてiPhoneでSDKDoc見れるビューアーがあるとうれしいかもと思う、今日この頃。


2008年10月20日月曜日

今日のcocoa

今日は、mkinoさんのHMDT本(白)を再度読んでcocoaアプリの作り方を勉強。

適当にやってても作れそうだけど、意味がわからないといつまでたってもマニュアルが手放せないまま
なので改めて読む。

作ったのは、本にも例として掲載されているCPUMonitor。

CPU Usage の取得などはサンプルをそのまま利用してしまいましたが、
Darwin のインターフェースをたたく必要があり。




その後iPhoneアプリ作成。
アイフォーンの皮に倣って1-viewアプリを作る。

作ったのはiPhoneサンプルのReachability 改造版。

そもそもReachability は 特定のHTTPサイトへの Reachability、インターネットへのReachability、ad-hocネットワークへのReachability を1枚のtableview に表示するアプリ。 

この3つのReachabilityを segmented control で表示切替し、textfield つけて任意のHTTPサイトをチェック可能にし、webviewを貼付けてプレビューできるようにした。いろいろなGUIコンポーネントを使ってみた的習作アプリ。



学んだこと

  • textfield 入力後のソフトウェアキーボード非表示、ユーザが決定押したときに呼ばれる textFieldShouldReturn でフォーカスを手放せばいい。
  • データはコントローラが持ってた方がよい

はまったこと
  • InterfaceBuilder でクラス名を指定する前にoutlet追加して、その後にクラス名を入力すると再度outlet入力するはめになる。そのまま利用すると同じ名前のoutletが二つ見える状態になり、間違った方に接続してviewが反映されない的な。。。
  • webview でwww.apple.comを表示すると、かなりの確率で表示が乱れるor表示できない状態で、しばらく自分のコードを疑っていたけど、他のサイトだと問題なく表示された。

この間、皮の作業を横で見学していろいろわかった気になったけれども、
実際にやるとわかんないことおおい。

アプリ完成したけど、メモリリークしまくりに違いないのと実機でまだ試してないので、次はそれらをやってみる。