NSTableViewのセルについてかなり悩まされたのでメモしておく。
まず、Cocoa Touchと同様に
- NSTableViewDataSource
- NSTableViewDelegate
の2つのプロトコルがある。
Cocoa TouchではreuseIdentifierを使ってcellのインスタンスを再利用するようになっているが、CocoaではNSTableColumnにsetDataCell:したcellを再利用するようになる。
#pragma mark NSTableViewDataDelegate
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
return [tableColumn dataCell];
}
注意したいのが、NSTableViewの各カラムで使用されるセルは再利用されるということ。つまり同じインスタンスを使い回している。
NSTextFieldCellやNSImageCellなどのtextやimageは列と行に対応したobjectValueをセットしてやる。
イメージやテキストを含んだcell(NSCell)はInterfaceBuilderで作れない。
NSCellを継承したCustomCellクラスを作りコードでtextやimageを描画してやる必要がある。また、cellはobjectValueを1つしか受け取れない。
- (id)tableView:objectValueForTableColumn:row:
id型で返すことになるのでAlbumオブジェクトのようなtitle, song等を含むオブジェクトを返してやる。
あとはCustomCellクラスでAlbunオブジェクトの情報を描画してやればいい。
- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
こんな感じ。
Macを使っていると知らず知らずのうちに同じネットワーク内のPCやサーバーを見つけてくれる。これすごく不思議。
Bonjourっていう技術が使われているんだけど、これについてはRefernceでが2冊、サンプルコードが1つ公開されてる。
ReferenceのほうはBonjourの仕組みとNSNetServiceクラスとNSNetServiceBrowserクラスについて解説してる。これはがんばって読んでおかないといけない内容だろうね。
サンプルはクライアント/サーバー型で画像ファイルが送受信できる内容になっていてこれをベースにすればなんでも出来そうな予感。他にもパスコードやら暗号化やら追加する必要があるだろうけど。
あ〜、ちょっとだけでも関わっておけば良かった、と後悔してるけど今となっては仕方ない。
iPhoneのApp Storeのローンチを経験したデベロッパーには周知の事実だと思いますが、Mac App Storeも同様にスタートダッシュが肝心。
受託でちまちまとiPhone appを作っていた企業さんもウカウカしてられませんぜ。イヒヒ。
・・・ということで自分もMac appを計画中。だいたい企画はできてきた。
これはすごい!というものではないけれど、これをベースに機能を追加していければいいと思う。
その他にも気になることがあってね。
iPhone appのVerUpは基本無料になってる。
ただ、Mac appでこのモデルを採用できるかということ。 既存のMacソフトだとMajor Version Upの際は新規ライセンスが必要になるよね。Mac App Storeでもこの方式を採用してくれないと正直困る。Mac appはiPhone appよりも開発コストがかかるし、機能追加の新バージョンを無料で提供しますよ〜というのは、デベロッパもAppleも大儲けできないよね。
11月の動きに注目だの。
こんにちは。
唐突ですが「Mac App Store」が発表になりました。ADC有料化はこの日のためにあった訳ですな。
そんなこんなで、アホウな自分はのってしまいました。
はじめます。
NSApplicationDelegate Protocol の applicationWillTerminate: についてメモ。
applicationWillTerminate: は、アプリケーションが終了する直前に呼ばれる。ドキュメントによる最後のクリーンアップ処理を行うことを想定している。
applicationWillTerminate: は、applicationShouldTerminate: が NSTerminateNow を返したときに通知される。
そして、ウィンドウがひとつしかない場合や最後のウィンドウが閉じた場合には applicationShouldTerminateAfterLastWindowClosed: が呼ばれ、YESを返した場合には上記の applicationShouldTerminate: が呼ばれる。
まとめてみる。
- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)theApplication {
// 最後のウィンドウが閉じられた
// 問題があればNOを返す。問題がなければYESを返す。
return YES; // applicationShouldTerminate: が呼ばれる
}
- (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender
{
// NSAppが終了しようとしている。
// 問題があれば NSTerminateCancel を返す。
// 問題がなければ NSTerminateNow を返す。
return NSTerminateNow; // applicationWillTerminate: が呼ばれる
}
- (void) applicationWillTerminate: (NSNotification *)aNotification
{
// 最後のクリーンアップ処理を行う。
}
NSApplication の terminate: は、メニューの [アプリケーションを終了 ⌘Q] を実行すると勝手に呼ばれる。
ちなみに、terminate: は applicationShouldTerminate: を実行する。
普通にアプリケーションを終了する場合には、terminate: は実行しなくていい。
そんな感じ。