<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkYBSXk5fip7ImA9WxBSF04.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410</id><updated>2009-12-25T18:42:38.726+09:00</updated><title>Cocoaの日々</title><subtitle type="html">MacOSXプログラミング。毎日更新。
話題： Cocoa, Objective-C, Snow Leopard</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://xcatsan.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>712</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/lQGG" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CEAEQX4zeSp7ImA9WxBSF0w.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-7692534707700903214</id><published>2009-12-25T12:45:00.000+09:00</published><updated>2009-12-25T12:45:00.081+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-25T12:45:00.081+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSView" /><title>NSView の表示順序と setWantsLayer:</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/7692534707700903214/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=7692534707700903214" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7692534707700903214?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7692534707700903214?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/XFcDtIa5kEg/nsview-setwantslayer.html" title="NSView の表示順序と setWantsLayer:" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/SzP3IDGmCQI/AAAAAAAAD10/hszSeKmsBgc/s72-c/091225-0004.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（layer-backed view の覚え書き）

NSView が複数のサブビューを持っている場合、後から追加したものが上に表示される。ところがサブビューの一つが -[NSView setWantsLayer:YES] を呼んで CoreAnimation layer を使う宣言をすると、追加順序が無視されて一番上に表示される。

Mac Dev Center: NSView Class Reference


以下、SimpleCap での例


サブビューの追加順序からすると右のボタンの方が上に表示されるのだが、左の画像を表示しているビューは -[setWantsLayer:YES]を呼んでいるために上に表示されてしまった。SimpleCapの場合、画像の載っているビューは CoreAnimationのトランジションを使う為に layer-backed view にしてある。


&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0BxMGMPDLbp3v2mdBRZPnlTBsdM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0BxMGMPDLbp3v2mdBRZPnlTBsdM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0BxMGMPDLbp3v2mdBRZPnlTBsdM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0BxMGMPDLbp3v2mdBRZPnlTBsdM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/XFcDtIa5kEg" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nsview-setwantslayer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4CSXw8fCp7ImA9WxBSFkU.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-3344381334791293461</id><published>2009-12-24T22:58:00.091+09:00</published><updated>2009-12-25T04:46:08.274+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-25T04:46:08.274+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xcode" /><title>Plug-in開発で検証・テスト用環境を作る〜 Xcodeで複数のターゲットを設定する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/3344381334791293461/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=3344381334791293461" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/3344381334791293461?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/3344381334791293461?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/hWTTncY9ldo/plug-in-xcode.html" title="Plug-in開発で検証・テスト用環境を作る〜 Xcodeで複数のターゲットを設定する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/SzMLMVwYIZI/AAAAAAAAD1k/vG0a-9peb6U/s72-c/091224-0021.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">今回開発する BlogAssistant はSafari のプラグインを予定しているが、開発途中の動作確認をいちいち Safariに読み込ませて行うのは非効率このうえない。とはいっても別途検証用のアプリを作るとソースコードの管理が面倒になる。１つのソースコードでプラグインと検証用アプリの２つをビルドできたら便利だ。実はXcodeはそれができる。今回はこの話題を扱う。

ターゲット

Xcode ではソフトウェア開発の最終成果物のことをターゲットと呼んでいる。このターゲットは新規にプロジェクトを作成する時に用意されているテンプレートを使うと標準で１つ用意される。

（例）



このターゲットは固定的なものではなく、開発目的に応じて変更したり、複数作成することができる。

今回は１つのプロジェクトでSafari用プラグインと通常のアプリケーションの２つのターゲットを作成してみる。


※
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w9-1FG4n3dtGaFo2c4Jmqef4bTQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9-1FG4n3dtGaFo2c4Jmqef4bTQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w9-1FG4n3dtGaFo2c4Jmqef4bTQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w9-1FG4n3dtGaFo2c4Jmqef4bTQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/hWTTncY9ldo" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/plug-in-xcode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcGQ3w4cCp7ImA9WxBSFU8.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-7242382738737117049</id><published>2009-12-23T08:20:00.000+09:00</published><updated>2009-12-23T08:20:22.238+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-23T08:20:22.238+09:00</app:edited><title>NSDrawThreePartImage と NSDrawNinePartImage</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/7242382738737117049/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=7242382738737117049" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7242382738737117049?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7242382738737117049?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/RTgoda_Xmh4/nsdrawthreepartimage-to.html" title="NSDrawThreePartImage と NSDrawNinePartImage" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZoUhefzk0CI/SzFFVMVOmMI/AAAAAAAADyU/MoXPgSujJgM/s72-c/091223-0003.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">Mac OS X V10.5 から Application Kit Functions に NSDrawThreePartImage と NSDrawNinePartImage という関数が用意された。今回はこれを試してみた。

NSDrawThreePartImage

関数のシグネチャは次の通り。
void NSDrawThreePartImage(NSRect frame,
   NSImage *startCap,
   NSImage *centerFill,
   NSImage *endCap,
   BOOL vertical,
   NSCompositingOperation op,
   CGFloat alphaFraction,
   BOOL flipped
);
（参照）Mac Dev Center: Application Kit Functions 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cBVhJuT_PrJDwxAjSZ62VbDbpsQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cBVhJuT_PrJDwxAjSZ62VbDbpsQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cBVhJuT_PrJDwxAjSZ62VbDbpsQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cBVhJuT_PrJDwxAjSZ62VbDbpsQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/RTgoda_Xmh4" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nsdrawthreepartimage-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YGQ3k4fip7ImA9WxBSFE8.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-9171208314877681550</id><published>2009-12-22T05:58:00.000+09:00</published><updated>2009-12-22T05:58:42.736+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-22T05:58:42.736+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FSEvent" /><category scheme="http://www.blogger.com/atom/ns#" term="SimpleCap" /><title>SimpleCap - ファイル更新反映</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/9171208314877681550/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=9171208314877681550" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/9171208314877681550?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/9171208314877681550?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/HLXgPS6Zk3E/simplecap_22.html" title="SimpleCap - ファイル更新反映" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/Sy1nNJwk7nI/AAAAAAAADyE/8pHnVv8foW0/s72-c/091220-0004.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: FSEvent - フォルダを監視する

SimpleCap へフォルダ監視の仕組みを導入して他のアプリでの変更を表示に反映するようにした。

例
例えば、まずキャプチャを行う。

プレビューを開き、画像を加工する。ここではグレースケール化して保存する。

数秒後に SimpleCap が変更を検出してメッセージを表示する。

表示中の画像も最新のものに置き換わる。


アプリ実装時の注意点など
プリファレンスで保存先が変更になった場合
KVOなどを使って検出し、一旦以前の FSEvent を破棄した後、再登録する。
破棄例：

 if (_fsevent_stream) {
  FSEventStreamStop(_fsevent_stream);
  FSEventStreamInvalidate(_fsevent_stream);
 }


ファイルが
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BCb4TC8qpXjEeaRAHDMP_gW5BbY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BCb4TC8qpXjEeaRAHDMP_gW5BbY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BCb4TC8qpXjEeaRAHDMP_gW5BbY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BCb4TC8qpXjEeaRAHDMP_gW5BbY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/HLXgPS6Zk3E" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/simplecap_22.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4GQXs-cCp7ImA9WxBSE0s.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-4624690614909884560</id><published>2009-12-21T12:42:00.001+09:00</published><updated>2009-12-21T12:42:00.558+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T12:42:00.558+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><title>NSTableView にカスタムセルを表示する (14) ボタンをつける〜ボタンの表示とイベント処理</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/4624690614909884560/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=4624690614909884560" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4624690614909884560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4624690614909884560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/7SrFI-KUnMM/nstableview-14.html" title="NSTableView にカスタムセルを表示する (14) ボタンをつける〜ボタンの表示とイベント処理" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/SylrRh2NeeI/AAAAAAAADxM/delCq2h8ZGk/s72-c/091217-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムセルを表示する (13) ボタンをつける〜マウスイベントの結果をセルで使う

ようやくボタンの作成まできた。先に出来上がりのイメージを掲載しておく。

起動直後のウィンドウ


ボタンの上にマウスを載せる




ボタンを押す（分かりやすい様に目立つ色にしてある）




実装

前回からも色々手を入れたのでソースコードを見てもらうのが一番わかりやすいと思う。ここではポイントだけ解説する。

CustomCellControl.h

#import 

enum CONTROL_STATE
{
 CONTROL_STATE_OFF,
 CONTROL_STATE_ON,
 CONTROL_STATE_OVER
};
@interface CustomCellControl : NSObject {

 NSRect frame
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ehA2IrZ4FJYjQn4AO-uhxiwxj44/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ehA2IrZ4FJYjQn4AO-uhxiwxj44/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ehA2IrZ4FJYjQn4AO-uhxiwxj44/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ehA2IrZ4FJYjQn4AO-uhxiwxj44/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/7SrFI-KUnMM" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-14.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IEQX09eSp7ImA9WxBSEks.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-5634597306260052071</id><published>2009-12-20T07:25:00.046+09:00</published><updated>2009-12-20T07:25:00.361+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-20T07:25:00.361+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="情報" /><title>今週のCocoa情報(12/20) - 今週気になった Cocoaプログラミング情報の紹介</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/5634597306260052071/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=5634597306260052071" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5634597306260052071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5634597306260052071?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/AE72-n2myTU/cocoa1220-cocoa.html" title="今週のCocoa情報(12/20) - 今週気になった Cocoaプログラミング情報の紹介" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">Create a Map with "Struct" in NSDictionary in Objective-c? - Stack Overflow
　Struct(Cの構造体) を NSDictionary へ入れる話。NSValue でラップしてやる。


MAAttachedWindow NSWindow subclass » Matt Legend Gemmell
　Snow Leopard でドックを右クリックすると出てくる吹き出し風ウィンドウを表示するライブラリ。


drawing NSImage tiles - Stack Overflow
　NSDrawThreePartImage( ) という関数があるらしい（初めて知った）。今度試してみよう。
　Mac Dev Center: Application Kit Functions Reference


What 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-i6ASKtH8JSHzQ3iTRqYMEapckE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-i6ASKtH8JSHzQ3iTRqYMEapckE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-i6ASKtH8JSHzQ3iTRqYMEapckE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-i6ASKtH8JSHzQ3iTRqYMEapckE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/AE72-n2myTU" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/cocoa1220-cocoa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8MQXc-fyp7ImA9WxBSEUo.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-7971019346659838425</id><published>2009-12-19T06:48:00.000+09:00</published><updated>2009-12-19T06:48:00.957+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-19T06:48:00.957+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><title>NSCell の内容をポップアップ表示する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/7971019346659838425/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=7971019346659838425" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7971019346659838425?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7971019346659838425?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/obkNUNs2hWU/nscell.html" title="NSCell の内容をポップアップ表示する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/SyW28fZDluI/AAAAAAAADwc/dsEWRQSZTAg/s72-c/091214-0009.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">NSCell には面白いメソッドが用意されていて、マウスをセルの上に持っていった時にポップアップでセルの内容を表示することができる。




expansionFrameWithFrame:inView:Returns the expansion cell frame for the receiver.
- (NSRect)expansionFrameWithFrame:(NSRect)cellFrame inView:(NSView *)view


Mac Dev Center: NSCell Class Reference


サブクラスでオーバーライドしてポップアップ表示するセルのフレームを返すと、後は自動的にポップアップが表示される。

（例）少しづらした位置にセルよりも大きいサイズでポップアップを表示する。


- (NSRect)
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1ZLnLLzCOsuiCTpg091TU5IW9gg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1ZLnLLzCOsuiCTpg091TU5IW9gg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1ZLnLLzCOsuiCTpg091TU5IW9gg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1ZLnLLzCOsuiCTpg091TU5IW9gg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/obkNUNs2hWU" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nscell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEMQXg-eCp7ImA9WxBSEUk.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-818396296170215373</id><published>2009-12-18T22:58:00.000+09:00</published><updated>2009-12-18T22:58:00.650+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-18T22:58:00.650+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><title>NSTableView にカスタムセルを表示する (13) ボタンをつける〜マウスイベントの結果をセルで使う</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/818396296170215373/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=818396296170215373" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/818396296170215373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/818396296170215373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/9yJ1NwcRH0Q/nstableview-13.html" title="NSTableView にカスタムセルを表示する (13) ボタンをつける〜マウスイベントの結果をセルで使う" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/SygT_RNT_zI/AAAAAAAADxE/xO9_pDCkAaY/s72-c/091215-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムセルを表示する (12) ボタンをつける〜NSTableViewのサブクラスでマウスイベント処理

前回まででNSTableView（のサブクラス）でマウスイベント処理のカスタマイズができた。 このNSTableViewからのイベントは、最終的に今後セル上に配置する予定のボタンで処理できるようにする必要がある。

（イメージ）

マウスイベント
　↓
CustomTableView（NSTableView）
　↓
CustomCell（NSCell）
　↓
ボタン（NSObject、多分）

ボタンを作成する前に、今回はマウスイベントを CustomCellへ伝える処理を考えてみる。


イベントの伝搬

前回実装した CustomTableView のマウスイベントハンドラにセルへイベントを伝搬させるコードを追加する。

※
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pYGuvaXggypB45-MLZ2t87oOA_o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pYGuvaXggypB45-MLZ2t87oOA_o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pYGuvaXggypB45-MLZ2t87oOA_o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pYGuvaXggypB45-MLZ2t87oOA_o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/9yJ1NwcRH0Q" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4CSH48fCp7ImA9WxBSEE0.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-7473375312282130400</id><published>2009-12-17T06:28:00.004+09:00</published><updated>2009-12-17T08:09:29.074+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-17T08:09:29.074+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FSEvent" /><title>FSEvent - フォルダを監視する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/7473375312282130400/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=7473375312282130400" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7473375312282130400?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7473375312282130400?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/8n_L3p6jgWo/fsevent.html" title="FSEvent - フォルダを監視する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: SimpleCap - アプリケーションボタン

前回 SimpleCap にアプリケーションパレットを追加した。これを使って他のアプリケーションで画像を編集することもできるのだが、編集後は最新の画像を SimpleCap側でも表示したい。その為には画像ファイルの更新状況を知る必要があるが今回は検証も兼ねて FSEvent を調べてみた。


FSEvent

FSEvent は指定したフォルダの変更を通知してくれるフレームワーク。Mac OS X v10.5 から導入された。

（参考）
Leopard解体新書--第5回：ファイル監視を行うFSEvent - Leopard解体新書 - page2 - ZDNet Japan

Mac Dev Center: File System Events Programming Guide: Using the 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fI_TNu0OqIpmiU0Y-JFfOqDkI84/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fI_TNu0OqIpmiU0Y-JFfOqDkI84/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fI_TNu0OqIpmiU0Y-JFfOqDkI84/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fI_TNu0OqIpmiU0Y-JFfOqDkI84/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/8n_L3p6jgWo" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/fsevent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUDRXc4fCp7ImA9WxBTGU4.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-1380021804092540894</id><published>2009-12-16T05:48:00.001+09:00</published><updated>2009-12-16T12:31:14.934+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-16T12:31:14.934+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SimpleCap" /><title>SimpleCap - アプリケーションボタン</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/1380021804092540894/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=1380021804092540894" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/1380021804092540894?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/1380021804092540894?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/CIa-uCf2WDU/simplecap_16.html" title="SimpleCap - アプリケーションボタン" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZoUhefzk0CI/SyalZ2SmNBI/AAAAAAAADwk/-5hm9pBp_G0/s72-c/091215-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">Cocoaの日々: NSMatrix を使いカスタムボタンパレットを実装する

前回用意したカスタムボタンパレットを SimpleCapへ組み込んだ。

こんな感じ。

ボタンを押すとそのアプリケーションが表示中の画像を使って起動する。
これに伴って左下のアプリケーションメニューボタンは無くした。
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NB65CNRoH5EFXDDdDlwobJWSc60/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NB65CNRoH5EFXDDdDlwobJWSc60/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NB65CNRoH5EFXDDdDlwobJWSc60/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NB65CNRoH5EFXDDdDlwobJWSc60/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/CIa-uCf2WDU" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/simplecap_16.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUDQ3c-eSp7ImA9WxBTGE8.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-5761235030574951917</id><published>2009-12-15T05:47:00.001+09:00</published><updated>2009-12-15T05:57:52.951+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-15T05:57:52.951+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><category scheme="http://www.blogger.com/atom/ns#" term="NSMatrix" /><title>NSMatrix を使いカスタムボタンパレットを実装する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/5761235030574951917/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=5761235030574951917" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5761235030574951917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5761235030574951917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/h91tNTg7dGo/nsmatrix.html" title="NSMatrix を使いカスタムボタンパレットを実装する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZoUhefzk0CI/SyQUch3c8EI/AAAAAAAADvk/b79gxgg9Mow/s72-c/091212-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">カスタムボタンパレット

NSMatrix を使ってカスタムボタンを並べたパレット（バー）を作った。SimpleCap で使うつもりなので、用途を特化して縦一列でアプリケーションのアイコンだけを表示する仕様にした。

できあがりはこんな感じ。

開発時に確認がしやすいようにアイコンのサイズは大きくしてある。

マウスをボタンの上に置くと背景を灰色にする。


ボタンを押すと画像を暗くする。





クラス構成

３つのクラスからなる。
ApplicationButtonPallette ... パレットを利用するためのメソッドを提供する。
ApplicationButtonMatrix   ... NSMatrix のサブクラス。マウスイベントやセルを管理する。
ApplicationButtonCell     ... NSCell のサブクラス。ボタンの描画を行う。
クライアントは
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/23CzWhNwOAw-BpKykVmAJ8evCPY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/23CzWhNwOAw-BpKykVmAJ8evCPY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/23CzWhNwOAw-BpKykVmAJ8evCPY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/23CzWhNwOAw-BpKykVmAJ8evCPY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/h91tNTg7dGo" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nsmatrix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMQXo6eyp7ImA9WxBTF0s.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-8818850455676578384</id><published>2009-12-14T12:48:00.006+09:00</published><updated>2009-12-14T12:48:00.413+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-14T12:48:00.413+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSTableView" /><title>NSTableView にカスタムセルを表示する (12) ボタンをつける〜NSTableViewのサブクラスでマウスイベント処理</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/8818850455676578384/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=8818850455676578384" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8818850455676578384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8818850455676578384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/-BIiQ66JDeA/nstableview-12-nstableview.html" title="NSTableView にカスタムセルを表示する (12) ボタンをつける〜NSTableViewのサブクラスでマウスイベント処理" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/SyV0aOiAEuI/AAAAAAAADwE/V9YNohvwAS8/s72-c/091214-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムセルを表示する (11) ボタンをつける〜NSCellのマウスイベントの扱い

NSTableView のサブクラスを作り、ここでマウスイベントを拾うことにした。


コード

移動中のマウスの動きもトラッキングしたい。Mac OS X v10.5 以降は NSTrackingArea が用意されているのでこれを使う。

（参考）Cocoaの日々: NSTrackingArea

CustomTableView.h
@interface CustomTableView : NSTableView {

 NSTrackingArea* trackingArea;

}
@property (retain) NSTrackingArea* trackingArea;

@end

トラッキング対象となるエリア（
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dUHSgtUHHwH2pcEAj0ggmqRTdf0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dUHSgtUHHwH2pcEAj0ggmqRTdf0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dUHSgtUHHwH2pcEAj0ggmqRTdf0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dUHSgtUHHwH2pcEAj0ggmqRTdf0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/-BIiQ66JDeA" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-12-nstableview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MARXY4fCp7ImA9WxBTFkg.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-144486289777054646</id><published>2009-12-13T06:51:00.002+09:00</published><updated>2009-12-13T07:04:04.834+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-13T07:04:04.834+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="情報" /><title>今週のCocoa情報(12/13) - 今週気になった Cocoaプログラミング情報の紹介</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/144486289777054646/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=144486289777054646" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/144486289777054646?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/144486289777054646?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/NWJ-OPDFdVs/cocoa1213-cocoa.html" title="今週のCocoa情報(12/13) - 今週気になった Cocoaプログラミング情報の紹介" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">Objective-C accessor declarations (readonly, readwrite, etc) - Stack Overflow

プロパティを外部には readonly として公開し、クラス内部では readwrite として使う方法が紹介されていた。
以下、コードを引用する。

in the book, "Cocoa Design Patterns," the author sometimes declares a property in the @interface as readonly:
// .h
@property (readonly, copy) NSArray *shapesInOrderBackToFront;
and then later adds an unnamed category to the implementation (.m)
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/AKkMWmCW39QgVod23kTGc26bH4I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AKkMWmCW39QgVod23kTGc26bH4I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/AKkMWmCW39QgVod23kTGc26bH4I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/AKkMWmCW39QgVod23kTGc26bH4I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/NWJ-OPDFdVs" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/cocoa1213-cocoa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMCQ3ozeyp7ImA9WxBTFUo.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-4195037780720879265</id><published>2009-12-12T08:01:00.000+09:00</published><updated>2009-12-12T08:01:02.483+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-12T08:01:02.483+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>tips: 開発中に実行時の言語を英語に切り替える</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/4195037780720879265/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=4195037780720879265" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4195037780720879265?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4195037780720879265?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/j4AhTEb04y8/tips.html" title="tips: 開発中に実行時の言語を英語に切り替える" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZoUhefzk0CI/SxmVK4ifouI/AAAAAAAADtM/fw2p3WFq2XA/s72-c/091205-0026.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">以前コマンドラインで言語設定を行う方法を紹介した。

Cocoaの日々: 任意の言語でアプリを起動する

このオプションを Xcode に設定すると開発中に簡単に実行時の言語を切り替えられる。

方法は Xcode の左の実行可能ファイルで開発中のファイルを選び「情報を見る」を開く。




「起動時に引き渡される引数」へ設定を追加する。



後はチェックをつけて実行すえば英語になるし、外せば日本語になり、簡単に切り替えられる。
ローカライズするアプリケーションを開発している時には便利。
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VuBtKQ5rCMuYh3tI3k4UvpZYCS8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VuBtKQ5rCMuYh3tI3k4UvpZYCS8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VuBtKQ5rCMuYh3tI3k4UvpZYCS8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VuBtKQ5rCMuYh3tI3k4UvpZYCS8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/j4AhTEb04y8" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGQX0ycCp7ImA9WxBTFU0.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-5599507513905495756</id><published>2009-12-11T12:52:00.001+09:00</published><updated>2009-12-11T12:52:00.398+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-11T12:52:00.398+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><title>NSTableView にカスタムセルを表示する (11) ボタンをつける〜NSCellのマウスイベントの扱い</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/5599507513905495756/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=5599507513905495756" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5599507513905495756?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5599507513905495756?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/jOMZDNDsCVs/nstableview-11-nscell.html" title="NSTableView にカスタムセルを表示する (11) ボタンをつける〜NSCellのマウスイベントの扱い" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZoUhefzk0CI/SyGDUaQEKCI/AAAAAAAADvc/nd5kpelfJKI/s72-c/091211-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">※タイトルが実体とそぐわなくなったので変えました（「カスタムビュー」⇒「カスタムセル」）。

（前回）Cocoaの日々: NSTableView にカスタムビューを表示する (10) カスタムセル＋CoreData のメモリ利用状況

今度はカスタムセルの中にボタンを作ることにする。

アプローチ

画像や文字は表示するだけなので描画するだけなのだが、ボタンの場合はマウスイベントを処理する必要がある。カスタムセルの中の場合、単純に NSButton（や NSButtonCell）を貼付けるといった方法がとれない為、少しやっかいだ。試していないのであるいはそっちの方が楽かもしれないが、ボタンの挙動をカスタマイズしたいので自前で作ることにする。ボタンの挙動は Cocoaのそれではなく、Webアプリのボタンのそれに近いものにする。

次のような３つの状態を持たせる。

　(1)通常状態
　(2
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7SqvVykOLHpWZd8U9QhNqw3WcNM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7SqvVykOLHpWZd8U9QhNqw3WcNM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7SqvVykOLHpWZd8U9QhNqw3WcNM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7SqvVykOLHpWZd8U9QhNqw3WcNM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/jOMZDNDsCVs" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-11-nscell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4EQX84cSp7ImA9WxBTFEk.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-2478716468994208890</id><published>2009-12-10T21:25:00.000+09:00</published><updated>2009-12-10T21:25:00.139+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-10T21:25:00.139+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLite" /><category scheme="http://www.blogger.com/atom/ns#" term="coredata" /><title>CoreData - SQLite のオプション（pragma）</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/2478716468994208890/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=2478716468994208890" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/2478716468994208890?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/2478716468994208890?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/vQoC1clnY0I/coredata-sqlite-pragma.html" title="CoreData - SQLite のオプション（pragma）" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">CoreData で SQLite を使う場合でも SQLite のオプション（pragma）を設定することができる。今回はその覚え書き。

Persistent Store Features
SQLite Store ＞ Configuring a SQLite Store's Save Behavior
Mac Dev Center: Core Data Programming Guide: Persistent Store Features

サンプルコードを以下に引用する。
NSPersistentStoreCoordinator *psc = /* assume this exists */ ;

NSMutableDictionary *pragmaOptions = [NSMutableDictionary dictionary];
[pragmaOptions 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Piep4ZhmBrsNHLRWh8e7ZrM6-CE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Piep4ZhmBrsNHLRWh8e7ZrM6-CE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Piep4ZhmBrsNHLRWh8e7ZrM6-CE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Piep4ZhmBrsNHLRWh8e7ZrM6-CE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/vQoC1clnY0I" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/coredata-sqlite-pragma.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IGQ3YyeSp7ImA9WxBTFEU.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-6513941369092025850</id><published>2009-12-09T12:54:00.094+09:00</published><updated>2009-12-11T07:52:02.891+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-11T07:52:02.891+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="coredata" /><title>NSTableView にカスタムビューを表示する (10) カスタムセル＋CoreData のメモリ利用状況</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/6513941369092025850/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=6513941369092025850" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/6513941369092025850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/6513941369092025850?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/VhyDzLVqaL4/nstableview-10-coredata.html" title="NSTableView にカスタムビューを表示する (10) カスタムセル＋CoreData のメモリ利用状況" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZoUhefzk0CI/Sx7gMjLa7lI/AAAAAAAADus/J2KLqvMdnvs/s72-c/091209-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: Cocoaの日々: NSTableView にカスタムビューを表示する (9) カスタムセルでCoreDataを扱う

前回作成した NSTableView + カスタムセル + CoreData のメモリ利用状況を調べてみた。
※以下、Mac OS X v10.5.8、XCode3.1、PowerBook G4 (PowerPC 1.5GHz/1GB）で調査

Instruments

以前作った NSArrayベース（オンメモリ）での1000件での状況と比較してみる。
（なお結果は使っている環境や状況によって変わる。１、２回しか試していないので厳密では無いことに注意）

NSArrayベースの実装

# Overall: 25,059
# Net: 10,085
Overall Bytes: 約30MB  (30,017,440)
Net Bytes: 約
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JPQriDsNlJS9luTsW8ILIy02Blw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JPQriDsNlJS9luTsW8ILIy02Blw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JPQriDsNlJS9luTsW8ILIy02Blw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JPQriDsNlJS9luTsW8ILIy02Blw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/VhyDzLVqaL4" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-10-coredata.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYBSXY8cCp7ImA9WxBSF04.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-8612657864267885865</id><published>2009-12-08T06:54:00.038+09:00</published><updated>2009-12-25T18:42:38.878+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-25T18:42:38.878+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSImage" /><title>NSImage の isFlipped/setFlipped: が Deprecated</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/8612657864267885865/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=8612657864267885865" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8612657864267885865?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8612657864267885865?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/Xqs32gS0pD8/nsimage-no.html" title="NSImage の isFlipped/setFlipped: が Deprecated" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/Sx17juZRkTI/AAAAAAAADuk/KB1uIFmPiS0/s72-c/091208-0003.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">NSImage を NSView へ描画するコードを書いていて isFlipped/setFlipped: が Mac OS X v10.6 から Deprecated になっているのに気がついた。

Mac Dev Center: Deprecated NSImage Methods

なんてこった。便利なのでよく使っていたのだが。。


flipped な NSView に NSImage を drawAtPoint:fromRect:operation:fraction: などでそのまま描くと画像は上下反転して描かれる。


今までは -[NSImage setFlipped:YES] を呼んでおくと座標系が合って正しく描画されていた。
setFlipped: が使えないとなるとどうすれば良いのか。


リファレンスを眺めていると NSAffineTransform を使って座標系
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LgF1ErJ1IFF0MHx9dJ8c7xKe3Qc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LgF1ErJ1IFF0MHx9dJ8c7xKe3Qc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LgF1ErJ1IFF0MHx9dJ8c7xKe3Qc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LgF1ErJ1IFF0MHx9dJ8c7xKe3Qc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/Xqs32gS0pD8" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nsimage-no.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IAQXszeip7ImA9WxBTEUU.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-6520422260337141721</id><published>2009-12-07T21:39:00.000+09:00</published><updated>2009-12-07T21:39:00.582+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-07T21:39:00.582+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><category scheme="http://www.blogger.com/atom/ns#" term="coredata" /><title>Cocoaの日々: NSTableView にカスタムビューを表示する (9) カスタムセルでCoreDataを扱う</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/6520422260337141721/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=6520422260337141721" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/6520422260337141721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/6520422260337141721?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/P5y9Z8QRZ_M/cocoa-nstableview-9-coredata.html" title="Cocoaの日々: NSTableView にカスタムビューを表示する (9) カスタムセルでCoreDataを扱う" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/SxzPmK8RswI/AAAAAAAADtc/9hE6UG3SycM/s72-c/091207-0006.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: メモリ対決：NSTableView+カスタムセル vs NSCollectionView

前回の結果を受けてユーザインタフェイスには NSTableView+カスタムセルの組み合わせを使うことにする。今回は NSTableView+カスタムセルと CoreData の組み合わせについて検証する。


NSTableView+カスタムセルと CoreDataの組み合わせ

※ここでいうカスタムセルとは、１つのセルの中に複数の情報を表示する特別なセルを意味する。

通常のセルを使う場合 NSTableView と CoreData の相性は非常に良くて、連結はほとんど Bindings設定だけで済む。ただカスタムセルを使う場合は少し工夫が必要となる。前回までの検証では CoreData を使わないケースでカスタムセルとデータをバインドしていた。

Cocoaの
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MBCFtXCf-PFJU7E-PUt4EnRML5c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MBCFtXCf-PFJU7E-PUt4EnRML5c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MBCFtXCf-PFJU7E-PUt4EnRML5c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MBCFtXCf-PFJU7E-PUt4EnRML5c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/P5y9Z8QRZ_M" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/cocoa-nstableview-9-coredata.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GRHc6eSp7ImA9WxBTEUg.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-7672365441650838200</id><published>2009-12-06T07:24:00.049+09:00</published><updated>2009-12-07T12:00:25.911+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-07T12:00:25.911+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="情報" /><title>今週のCocoa情報(12/6) - 今週気になった Cocoaプログラミング情報の紹介</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/7672365441650838200/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=7672365441650838200" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7672365441650838200?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/7672365441650838200?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/JgQboWpfDpk/cocoa126-cocoa.html" title="今週のCocoa情報(12/6) - 今週気になった Cocoaプログラミング情報の紹介" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/SxrZ-Z0ZwzI/AAAAAAAADtU/ksr634cQUo8/s72-c/091206-0001.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">Memory Management of Interface Builder Outlets - Stack Overflow

プロパティを IBOulet として使っている場合のメモリ管理についての話題。

ちょっと試してみた。非プロパティの object_normal、プロパティの object_assign、プロパティの object_retain の３種類の IBOutlet を用意する。


@interface MemoryStudyAppDelegate : NSObject  {
    NSWindow *window;
 
 IBOutlet NSObject* object_normal;
 NSObject* object_assign;
 NSObject* object_retain;
}

@property (assign) IBOutlet 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HMlGXL5AgL62_4lhJf1-33G0AlE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HMlGXL5AgL62_4lhJf1-33G0AlE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HMlGXL5AgL62_4lhJf1-33G0AlE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HMlGXL5AgL62_4lhJf1-33G0AlE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/JgQboWpfDpk" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/cocoa126-cocoa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEAQHkzeSp7ImA9WxNaGUs.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-8938993344562968656</id><published>2009-12-05T08:00:00.000+09:00</published><updated>2009-12-05T08:00:41.781+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-05T08:00:41.781+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SimpleCap" /><title>SimpleCap - メニューキャプチャ改良 〜 メニューバー幅調整</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/8938993344562968656/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=8938993344562968656" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8938993344562968656?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8938993344562968656?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/sKE41Z5n1Gg/simplecap.html" title="SimpleCap - メニューキャプチャ改良 〜 メニューバー幅調整" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_ZoUhefzk0CI/SxmTWan8VEI/AAAAAAAADss/pnXmiglMGNQ/s72-c/091205-0024.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">SimpleCap でメニューキャプチャをするとメニューバー（一番上のメニューの並び）の一番左側から含まれる。こんな感じ。





わざわざこういう仕様したのだが使っているとどうも見た目がよくない。そこで実際の幅に合わせるようにした。ただ従来の表現も捨てがたいし、互換性も持たせたいのでオプションで切り替えられるようにする。



「メニューバーを実際の幅に合わせる」にチェックをいれると先ほどのキャプチャ例はこうなる。





- - - -
バージョン 1.1.0 で公開予定です。
（リリースは年内を目標..）
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/U66W-uApdtKukBk0SKoKhK2Llgw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U66W-uApdtKukBk0SKoKhK2Llgw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/U66W-uApdtKukBk0SKoKhK2Llgw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U66W-uApdtKukBk0SKoKhK2Llgw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/sKE41Z5n1Gg" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/simplecap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4DRns5eSp7ImA9WxBTEUg.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-3301449684640115047</id><published>2009-12-04T21:04:00.001+09:00</published><updated>2009-12-07T12:02:57.521+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-07T12:02:57.521+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCollectionView" /><title>メモリ対決：NSTableView+カスタムセル vs NSCollectionView</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/3301449684640115047/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=3301449684640115047" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/3301449684640115047?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/3301449684640115047?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/PeCd5G0_6AE/nstableview-vs-nscollectionview.html" title="メモリ対決：NSTableView+カスタムセル vs NSCollectionView" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/SxhPTBLR-iI/AAAAAAAADrE/oXKBYmp3l9k/s72-c/091202-0002.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: Cocoaの日々: NSTableView にカスタムビューを表示する (8) NSCollectionView で選択状態を描画する

NSCollectionView が NSTableView の代替として、機能的には使えそうなことがわかってきた。メモリ消費の観点ではどうだろうか。前回のサンプルを使い両者におけるメモリ利用状況を Instruments を使って比較してみた。

※以下、Mac OS X 10.5.8 (PPC)、Xcode 3.1、PowerBook G4 (1.5GHz/1GB) で検証


サンプルアプリ


Instruments

Xcodeを含む開発キットにはメモリ利用状況を調べることができる Instruments というツールが標準でついている。



これを使うとメモリの利用状況をクラス（オブジェクト毎）にグラフィカルに
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ljghH6KEjpiO1yBXU4k1j-76Zl0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ljghH6KEjpiO1yBXU4k1j-76Zl0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ljghH6KEjpiO1yBXU4k1j-76Zl0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ljghH6KEjpiO1yBXU4k1j-76Zl0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/PeCd5G0_6AE" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-vs-nscollectionview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8CQX0_fCp7ImA9WxNaGEk.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-4573462600648271062</id><published>2009-12-03T21:21:00.018+09:00</published><updated>2009-12-03T21:21:00.344+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-03T21:21:00.344+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCollectionView" /><title>Cocoaの日々: NSTableView にカスタムビューを表示する (8) NSCollectionView で選択状態を描画する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/4573462600648271062/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=4573462600648271062" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4573462600648271062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/4573462600648271062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/ulnzNn-6HxY/cocoa-nstableview-8-nscollectionview.html" title="Cocoaの日々: NSTableView にカスタムビューを表示する (8) NSCollectionView で選択状態を描画する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_ZoUhefzk0CI/Sxb091H06yI/AAAAAAAADpk/MKn7xLbtUsI/s72-c/091203-0002.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムビューを表示する (7) NSCollectionView

前回に続き NSCollectionView が NSTableView の代わりに使えないかを検証する。


アイテムの選択

NSCollectionView には Selectable というプロパティがあるが、これにチェックを入れても実際の動作では選択できない（アイテムを押しても何も起こらない）。


NSTableView のように選択をしたい。調べてみると他の人がこの問題に取り組んでいた。

NSCollectionViewを選択可能にする - The Invisible Designer
CocoaDev: NSCollectionView

これらを参考に選択できるようにしてみよう。


コーディング
※以下、MacOSX10.5(ppc)/
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8bnw_-uVZ9dXIek8ThZ8pd9Rk7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bnw_-uVZ9dXIek8ThZ8pd9Rk7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8bnw_-uVZ9dXIek8ThZ8pd9Rk7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bnw_-uVZ9dXIek8ThZ8pd9Rk7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/ulnzNn-6HxY" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/cocoa-nstableview-8-nscollectionview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFRn4yeyp7ImA9WxNaF04.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-5414780295531722122</id><published>2009-12-02T12:34:00.034+09:00</published><updated>2009-12-02T15:15:17.093+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-02T15:15:17.093+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><category scheme="http://www.blogger.com/atom/ns#" term="NSCollectionView" /><title>NSTableView にカスタムビューを表示する (7) NSCollectionView</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/5414780295531722122/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=5414780295531722122" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5414780295531722122?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/5414780295531722122?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/bybK42sMVvk/nstableview-7-nscollectionview.html" title="NSTableView にカスタムビューを表示する (7) NSCollectionView" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ZoUhefzk0CI/SxTnIevW6AI/AAAAAAAADoM/yoTdFTQnL24/s72-c/091201-0007.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムビューを表示する (6)カスタムセルにモデルオブジェクトの内容を描画する

前回カスタムセルで画像と文字列を描画したがこれを Interface Builder でデザインしたい。


カスタムセル VS カスタムビュー

同じ事を考える人がいて Stack Overflow に質問が出ていた。が、やはり難しそうだ。
Is it possible to design NSCell subclasses in Interface Builder? - Stack Overflow


となると通常通りカスタムビューを作成してデザインするしかない。その場合、カスタムセルでそのカスタムビュー（Nibになる）を読み込んで描画することになる。ただ NSTableView の上のセルの上に NSView を載せることになり、複雑な上
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/naAgkMmDDjf-bxoDquI4Grpkt6w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naAgkMmDDjf-bxoDquI4Grpkt6w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/naAgkMmDDjf-bxoDquI4Grpkt6w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/naAgkMmDDjf-bxoDquI4Grpkt6w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/bybK42sMVvk" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-7-nscollectionview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEECQXw_eSp7ImA9WxNaFkw.&quot;"><id>tag:blogger.com,1999:blog-9077495448448724410.post-8824175894970010179</id><published>2009-12-01T06:31:00.000+09:00</published><updated>2009-12-01T06:31:00.241+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-01T06:31:00.241+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="NSCell" /><title>NSTableView にカスタムビューを表示する (6)カスタムセルにモデルオブジェクトの内容を描画する</title><link rel="replies" type="application/atom+xml" href="http://xcatsan.blogspot.com/feeds/8824175894970010179/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=9077495448448724410&amp;postID=8824175894970010179" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8824175894970010179?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/9077495448448724410/posts/default/8824175894970010179?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/lQGG/~3/zxaTVp1__Co/nstableview-6.html" title="NSTableView にカスタムビューを表示する (6)カスタムセルにモデルオブジェクトの内容を描画する" /><author><name>xcatsan</name><uri>http://www.blogger.com/profile/07611922019852427552</uri><email>xcatsan@mac.com</email><gd:extendedProperty name="OpenSocialUserId" value="04147175101149136459" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ZoUhefzk0CI/SxODx1QSibI/AAAAAAAADoE/rFS7FPoOGsU/s72-c/091130-0010.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><content type="html">（前回）Cocoaの日々: NSTableView にカスタムビューを表示する (5)カスタムセルへ bindings経由でモデルオブジェクトを渡す

前回カスタムセルにモデルオブジェクトを渡すことができたので、今回はそれを描画してみる。

コーディング

一旦値が取得できれば描画は簡単。描画時に -[NSCell drawWithFrame:inView] が呼び出されるので、ここでモデルオブジェクトの内容をビューへ描けば良い。バンドル内の画像とタイトルを表示させてみた。

CustomCell.m

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
 Homepage* homepage = [self objectValue];
 NSImage* image = [[[NSImage 
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6i55lesc-7QG5dMK3jvLxEMQPwQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6i55lesc-7QG5dMK3jvLxEMQPwQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6i55lesc-7QG5dMK3jvLxEMQPwQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6i55lesc-7QG5dMK3jvLxEMQPwQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/lQGG/~4/zxaTVp1__Co" height="1" width="1"/&gt;</content><feedburner:origLink>http://xcatsan.blogspot.com/2009/12/nstableview-6.html</feedburner:origLink></entry></feed>
