Cocoaはさっぱり!!! version.8at MAC
Cocoaはさっぱり!!! version.8 - 暇つぶし2ch100:名称未設定
07/06/15 02:50:11 bwuLJcag0
>>98
NSViewBoundsDidChangeNotificationはどう?

101:名称未設定
07/06/15 14:58:04 ylLFz9lv0
>>100
ばっちり出来ました!!
ありがとうございます。

102:名称未設定
07/06/15 17:31:25 sL1ajDrz0
65です。
>>94さん
具体的なコードでのアドバイスありがとうございます。

>>97さん
NSAppというグローバル変数があるのですね、知りませんでした。勉強になります。
>- (NSManagedObjectContext *) managedObjectContext {
> return [[NSApp delegate] managedObjectContext];
>}
をWindowCOntrollerに書いてIBでバインドし直したら動作しました。
アドバイスありがとうございました。

>>89さん
バインディングについて指摘して頂きありがとうございました。
もっと勉強します。

みなさんからヒレガス本を読んだほうがよいというご指摘が多いので、
この週末に大きな本屋に行って探してみます。
なかったらアマゾンから注文してみようと思います。

みなさんからのアドバイスで一歩前進できました。
ありがとうございます。

103:97
07/06/15 21:57:45 /Xj5L+Cq0
>>102
何はともあれ動いて良かったですね。

ただ、これだけではundoが無効になります。
WindowControllerがwindowのdelegateになっているのを確認した上で、
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
return [[self managedObjectContext] undoManager];
}
をWindowControllerに追加しないといけません。

>NSAppというグローバル変数があるのですね、知りませんでした。勉強になります。
[NSApp currentEvent]を覚えておくと、いろいろ役に立つと思います。

それと、ご存じかもしれませんが、
Xcodeのソースで、メソッドやクラス等を
オプション+ダブルクリック、コマンド+ダブルクリックすると
役に立ちますよ。
例えば、NSAppをオプション+ダブルクリックしてみてください。

104:名称未設定
07/06/15 23:34:53 cvg4tVdc0
おお、横やりだがオプション+ダブルクリックは知らなかった。
これも便利だな。

105:名称未設定
07/06/16 07:38:36 rwxtbdkR0
65です
>>103さん
>- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
> return [[self managedObjectContext] undoManager];
>}
>をWindowControllerに追加しないといけません。
メニューの編集->取り消し、やり直しがディスエーブルされていましたが、
このコードを加えたらイネーブルになりました。
なんでこうなったのか仕組みがわかってないので調べてみます。

>Xcodeのソースで、メソッドやクラス等を
>オプション+ダブルクリック、コマンド+ダブルクリックすると
>役に立ちますよ。
わたしの場合は、メソッド、クラス名を選択して、
コントロール+クリックで表示されるコンテキストメニューから選んでいました。
ダブルクリックのほうが楽ちんですね。

アドバイスありがとうございます。

106:名称未設定
07/06/17 16:35:07 xFWdidLR0
他のアプリから作成したXMLファイルを自分のテーブルにインポートしたいのですが、
なにをどうすればよいのかさっぱりです。
どこか良いサイト、本などがありましたらお願いします。

107:名称未設定
07/06/17 18:17:50 9BssyYOD0
そのXMLファイルってのはplist形式なの?
だとしたら,NSDictionaryのdictionaryWithContentsOfFile:で読み込んでいじくればいいんじゃない?

というか,テーブルが何をさすのかがわからない.

108:名称未設定
07/06/17 18:51:44 MIixfL/i0
mkinoたんの本にXMLの説明あったよ

109:名称未設定
07/06/17 19:37:46 WyfXqzgv0
つNSXMLDTD

110:名称未設定
07/06/18 12:49:40 FnK6EgKv0
配列の要素値を参照する方法がわかりません。
他の言語みたいにarray[i]ではないのですか?
ネットでどこにも引っ掛からないのが不思議です。

あと配列の内容をテーブルビューに表示させるまでの方法も
さっぱりです。

111:名称未設定
07/06/18 12:55:48 bgV1qYg60
初学者向けの本を最初から最後まで読め。

112:名称未設定
07/06/18 13:06:28 XFI7IqHh0
>>110
配列の要素値を参照は普通にarray[i]でできない?
ひょっとして配列ってNSArrayの事じゃないよね。

テーブルビューについてはNSTableViewで検索してみなよ。
ま、DataSourceかNSArrayControllerを使えってことだよ。

113:名称未設定
07/06/18 22:16:32 f97Z48MF0
>>110
俺は、お前さんがどうやって配列を宣言できたのかの方がさっぱりわかりません。

114:名称未設定
07/06/19 00:44:29 dgDst+1p0
>>111-113
レスありがとうございます。配列は解決しました。
非常に単純なミスで要素値をログに吐く時に%dでフォーマットしてたので
変な数字しか出てこず、おかしいなあと悩んでいました。

>>112
NSTableView、DataSource、NSArrayControllerはなんとなくわかって定義しているのですが、
何をどうつなげていいのやら勉強中です。

115:名称未設定
07/06/19 23:11:33 8mzcE2x00
>>114
Bindingとか考えずに、基本的なやり方。

・IBで、TableViewのデータソースとなるオブジェクトを指定する。
 Controlキーを押しながらテーブルからインスタンスに向かってドラッグ
 インスペンタパネルの「Delegate」でDataSourceを指定する。

・そのままRun。すると「データソースとして振る舞うべきインスタンスに、
 以下のメソッドが定義されてないから、このテーブルは使えん」的な
 エラーがログに吐き出される。そこに挙げられたメソッドを自分で記述する。
 TableViewなら最低2つ。OutlineViewなら4つかな。

116:名称未設定
07/06/19 23:26:15 44NwgBsm0
一応定番サイトを貼っておく
URLリンク(hmdt.jp)

117:名称未設定
07/06/19 23:45:48 5FjzRd/E0
確かにバインディングって便利だけど、どんどん機能拡張していくと
途中から余計に面倒になって思考が停止していく...orz

118:名称未設定
07/06/20 00:15:31 8LhrRklA0
バインディング対応と非対応の差が激しくて、バインディング対応ばっかりで作るとどこかで見たアプリばっかりに成る罠。
変わったことをやろうとすると、バインディングで動くようにするのはかなり面倒。

119:名称未設定
07/06/20 00:31:22 Fh609W9/0
だからIBで完結するような処理なんかそんなもんだろ。
なんかコード書かなくてもアプリができるみたいな幻想にとらわれてない?

120:名称未設定
07/06/20 13:51:36 NBL8VQHj0
>>119
ない

121:名称未設定
07/06/20 13:58:11 zIQZO1vl0
今のIBは Binding が目で確認できないのが痛いです。
情報表示して Binding タブを選んでさらに各グループを開いて、、、
遠すぎだよ。

122:名称未設定
07/06/20 14:03:15 qldLJWyJ0
>>119
思い切りとらわれてた。
あっちとこっちを繋げてハイ出来上がり!って。
でも、結局はIBで簡単にUI作って細かい事はコードでってことになる。


123:名称未設定
07/06/20 21:59:07 Dj3TYUsU0
>>121
instancesタブのツリー表示のほうで、アウトレットの接続と同じように見えるよ。
見やすいかっていうと微妙だが。

124:121
07/06/20 22:14:45 P4Zq1w7a0
>>123
ほんまや!
微妙やけど無いよりましやな。
おおきに!

125:名称未設定
07/06/20 22:39:01 tciIHlVd0
バインディングやCoreDataって微妙な仕様が多いよねー
KVCを多用させるのも、いつまでたってもプロトタイプって感じがしてなんだかなー

126:名称未設定
07/06/21 00:31:41 1kp6zXNr0
KVCとプロトタイピングって関係ない。

127:名称未設定
07/06/21 01:05:19 +f5dJFAD0
>>115 >>116
ありがとうございます。なんとかできました。
csvファイルからインポートしてテーブルビューに表示させることができたのですが、
インポートするたびにエンティティにレコードが追加されていってしまいます。

インポート前にdeleteObjectでエンティティのレコードを全件削除をすれば解決するのですが、
なんだかちょっと手間がかかるというか、もっと簡単にエンティティをクリアする方法は
ないのでしょうか?

ご存知でしたらお願いします。

128:名称未設定
07/06/21 12:25:54 tIJB3hhC0
>>127
一件づつ deleteObject で削除するのでなく、一度に全件削除したいということ?
なら removeAllObjects で一気に削除できるけど。
NSArrayController 使ってるなら [[_arrayController content] removeAllObjects] で消えたはず。


129:名称未設定
07/06/22 19:40:14 M8f2QNll0
すいません、くだらない質問ですいません。
Quartz Composer.webplugin
って、コレ、標準で組込まれているんですか?
標準で組込まれているとしたら、
どのバージョンから入っているんですか?

130:名称未設定
07/06/23 17:43:44 ANfoSVtM0
スボットライト検索欄で、例えばスペース区切りでOR検索が
出来るようにするのは難しいんですかね?

131:名称未設定
07/06/23 17:48:27 KW8qTWkE0
>>130
Jobs|Gates : Jobs または Gates
Jobs(!Gates) : JobsかつGates以外
Jobs(Gates|Linus) : JobsかつGates、またはJobsかつLinus

132:名称未設定
07/06/23 21:06:01 QUWKqEkv0
すみません。テーブルビューののカラム表示でSQLの外部結合みたく、
別エンティティから同一キー(1対1の関係)のカラムを表示させるには、
テーブルカラムのバインディング設定だけでは難しいのでしょうか?

133:名称未設定
07/06/23 21:11:04 JrUKG2eE0
日本語でおk

134:名称未設定
07/06/24 15:08:55 7icx36z80
>>128
ありがとうございます。出来ました。

>>130
スボットライトではなくてNSSearchFieldのことでした。すみません。

例えばテーブルビューで「名前が"鈴木"かつ、年齢が"30"」といった
アンド検索が出来るようにしたいのですが、NSSearchFieldに
「鈴木 30」といったように入力して検索出来ればなあと。


135:名称未設定
07/06/24 16:35:48 sW58ZoIj0
そういうことが出来るようにするのがプログラミングじゃないのか。

136:名称未設定
07/06/24 21:23:09 oj7fKo9L0
>>134
NSSearchField自体は検索機能を持ってないから,
結局その部分を自分で実装すればいいだけの話.

137:名称未設定
07/07/01 00:21:27 5L+q9KzS0
そうそう、バインディング使わずに、基本的なウィンドウだけIBで作ってあとはコントローラ側から弄った方が速いしいろいろ出来る。

実用的なものを作ろうとすると、自分で実装しないと使えないのが多いよな。
マクが好きって幻想だけでがんばるのは辛い。orz
人海戦術も出来て儲けも桁違いに稼げるウィンドウズの方が全然魅力的だったり。orz

138:名称未設定
07/07/01 00:50:57 EwoNhQlG0
C++勉強するのが面倒だからObjective-Cが好きな俺は趣味PG

139:名称未設定
07/07/01 21:33:09 xbcqJltA0
テーブルビューなどでマウスホイールやクリックなどのイベントを拾うには
どうすれば良いのでしょうか?

検索すると- (void)mouseDown:(NSEvent*)theEvent;などが出てくるのですが、
これをどうやって使うのかがわかりません。
(NSResponderをどこで設定してどこに繋げたりするのかさっぱり)

非常に厨というか根本的な質問ですみません。


140:名称未設定
07/07/01 21:43:18 U0TJz2SZ0
>>139

・InterfaceBuilderで、NSTableViewのサブクラスMyTableViewを作る。
・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
・MyTableViewのファイルを書き出して、その@implementation内で
 - (void)mouseDown:(NSEvent*)eventなんかを上書きする。

141:名称未設定
07/07/02 01:31:45 /cUmymHP0
>>140
ありがとうございます。なんとなくわかってやってみたのですが、

>・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
IBOutlet NSTableView *fooTableView;

IBOutlet MyTableView *fooTableView;
に変更して、

MyTableView.mで、
- (void)mouseDown:(NSEvent*)theEvent
{
NSLog(@"hello");
}

とやってマウスをクリックしてみたのですが、ログが出力されません。

なにか足りない記述があるのでしょうか?






142:名称未設定
07/07/02 01:47:44 qDAYMWUG0
>>141
>>・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
>IBOutlet NSTableView *fooTableView;
>↓
>IBOutlet MyTableView *fooTableView;
>に変更して、
ソースコードの方だけじゃなくて、Nibファイルも変更しないとインスタンスは変わらないよ

1) InterfaceBuilder上で、MyTableViewにしたいNSTableViewのインスタンスを選択する。
2) Inspectorウインドウの上の方に付いているポップアップメニューから"Custum Class"を選ぶ
3) Class 一覧からMyTableViewを選ぶ

MyTableViewがClass一覧から選べない時は、IBのメインウインドウにヘッダーファイルを突っ込む。


143:名称未設定
07/07/02 12:13:39 qJAV3pLe0
最近、テーブルビューがらみの厨な質問を乱発してるのって、同じ人?

144:名称未設定
07/07/02 13:17:36 5wPz1kBF0
そうです。
すみません。

145:名称未設定
07/07/02 16:11:36 Ne8YEXNf0
ヒレガス本くらい読んどけよ。

146:名称未設定
07/07/07 19:07:56 odX4zdaf0
NSMutableDictionary があって、中身のキーを一つずつチェックして、キーがある条件を
満たしたら対応するオブジェクトを処理する、ということをしたいのですが、

これ、 -keyEnumerator を使ってやるのはよくないみたいですね。
(enumerate している間に dictionary の構造が変わるとまずいからでしょうが)
でもバリューのオブジェクトの値を変更するぐらいは許してほしいような。
どうやるのが正解(?)なんでしょう。

147:97
07/07/07 20:46:14 hFhQDWhy0
>>146
Collections Programming Topics for Cocoa
より引用
Enumerators: Traversing a Collection’s Elements

It is not safe to remove, replace, or add to a mutable collection’s elements while enumerating through it.
If you need to modify a collection during enumeration,
you can either: make a copy of the collection and enumerate using the copy;
or, collect the information you require during the enumeration and apply the changes afterwards.
The second pattern is illustrated in the following example.

NSMutableDictionary *myMutableDictionary = ... ;
NSMutableArray *keysToDeleteArray =
[NSMutableArray arrayWithCapacity:[myMutableDictionary count]];
NSString *aKey;
NSEnumerator *keyEnumerator = [myMutableDictionary keyEnumerator];
while (aKey = [keyEnumerator nextObject]) {
if( /* test criteria for key or value */ ) {
[keysToDeleteArray addObject:aKey];
}
[myMutableDictionary removeObjectsForKeys:keysToDeleteArray];

148:名称未設定
07/07/08 00:08:08 RHnYtpKj0
>>146
削除だけなら>>147でよさそうだけど、値の変更もしたいならallKeys の
NSArray でループするのが楽かな。
If you intend to modify the entries, use the allKeys method
to create a "snapshot" of the dictionary's keys. Then use this
snapshot to traverse the entries, modifying them along the way.

149:名称未設定
07/07/09 00:06:39 MKmnIjZg0
長時間費やしたのですが解決しなかったので質問させてもらいます。
ウィンドウ上に置いたボタンはsetKeyEquivalentで設定したキーで動作できるのですが、
ボタン上にaddSubviewして置いたボタンはsetKeyEquivalentをしてもキーで動作しません。
レスポンダチェイン周りを調べて自分なりに試行錯誤してみましたが解決しませんでした。
どうすれば動作するでしょうか?よろしくお願いします。

150:149
07/07/09 06:57:44 MKmnIjZg0
NSResponderを継承しているviewたちをウィンドウに配置してキーを押せば
performKeyEquivalentに入って来ます。上書きしてNSLogで確かめてみました。
しかしNSButtonにaddSubviewしたviewだと反応しないです。
acceptFirstResponderをYESで上書きしたりmakeFirstResponderを試しましたがダメでした。
けどなぜかNSSliderにaddSubviewした場合は反応しました。
まだ謎が解けません、、、お力添えをお願いします。

151:名称未設定
07/07/09 12:24:49 MtZ2kM7T0
NSButton が performKeyEquivalent を拾っているから、subview にはいかないということではなくて?


152:149
07/07/09 15:51:27 6JIdbr8F0
キーを押すと警告音がなるのでNSButtonはperformKeyEquivalentを拾っていないようです。
ためしにボタンのサブクラスでperformKeyEquivalentをreturn NOで上書きしてみましたが、
ボタン上のviewに処理が回ってこないという状態です。

153:名称未設定
07/07/09 17:37:28 uzTm6K720
>>152
試してみたけどsubviewのperformKeyEquivalentは呼ばれないみたいね。
対症療法だけどNSButtonのサブクラスを作ってperformKeyEquivalentを書くのはどう?

@implementation MyButton

- (BOOL)performKeyEquivalent:(NSEvent *)anEvent {
NSEnumerator* enumerator = [[self subviews] objectEnumerator];
id subview;

BOOL result = NO;
while ( ( subview = [enumerator nextObject] ) && !result )
result = [subview performKeyEquivalent:anEvent];

if ( !result )
result = [super performKeyEquivalent:anEvent];

return result;
}

@end

154:名称未設定
07/07/09 17:41:11 2FPmw6nT0
そもそも、ボタンの中にボタンを配置するって
おかしいと思わんのか

155:名称未設定
07/07/09 17:57:18 MZpOL97p0
>>154
みんな分かってるけど、それに突っ込むとどうなるかも知ってるからじゃね?

156:名称未設定
07/07/09 18:03:05 uzTm6K720
>>154
いや、それはそれで面白いインターフェースかもと思って試してた

157:146
07/07/09 18:25:05 LonmC7zt0
>>147 >>148
どうもありがとうございます。ちゃんとドキュメントを探すべきでした。
自分の場合値を変更するので >>148 のやり方になるんでしょうね。

158:149
07/07/09 21:47:15 HHAS6qp/0
NSButtonの上にボタンを、と例を挙げましたが実際にはボタンやビューということでした。
URLリンク(www.pinkapple.tv)
左は通常時で右がdrawRectを上書きしたビューをボタン上に配置したものです。
この状態でボタンもビューも独自にperformKeyEquivalentを動作させたかったのです。
(ビューにテキストを表示したり、ビューが他の色、他の機能のものに置き換わったりするので
ボタンの見かけを変えるだけではダメなのです)
ウィンドウ上でなくてボタン上に配置したかったのは、ボタンとビューとでいろいろとデータのやり取りをするのでsuperViewとsubViewの関係にした方が処理が楽だったからです。
ということで>>153さんの方法を試してみます。ありがとうございます。

159:149
07/07/10 05:34:16 TgqP272E0
>>153さんの方法でできました。
いろいろ調べるとperformKeyEquivalentメソッドはNSResponder、NSView、NSButtonで記述、上書きされていて、NSViewのperformKeyEquivalentは自分のsubviewに処理を送る機能があるようです。
なおかつsubviewへのperformKeyEquivalentが誰も反応しなければNOが返ってきてview自身の処理を行います。
>>153さんのはまさにそれらの機能をコードで記述したものになってます。ありがとうございました。

160:名称未設定
07/07/11 02:27:35 q/pS70mE0
いつもお世話になってます。

困っているので助けてください。

NSDrawerを作成し、ウィンドウにくっつけてtggleで動かしています。
ドロワーを開いたまま、ドロワーが画面外になるまでウィンドウを右に動かした後で
ウィンドウを左に持ってくるとドロワーが消えてしまいます。

myDrawer = [[NSDrawer alloc] initWithContentSize:NSMakeSize(300,300)preferredEdge:NSMaxXEdge];
[myDrawer setParentWindow:myWindow];
[myDrawer setContentView:myView];

としているだけなのですが、どなたか原因をご存知でしたら教えてください。

161:名称未設定
07/07/11 05:48:22 4RHpXxKf0
上のコードをコピペしてやってみましたが、おっしゃる現象は起きませんでした。
何かmyViewかmyDrawerに追加してる機能が邪魔してるのではないでしょうかね。

162:160
07/07/12 01:10:46 Mzn5q1ga0
>>161

ひとつだけ気になることがありました。ドロワーを開いた際にその下のウィンドウを
触らせたくないので、
-(void) drawerDidOpen:(NSNotification *)notification
{
 [NSApp runModalForWindow:myWndow];
}

-(void) drawerDidClose:(NSNotification *)notification
{
 [NSApp stopModal];
}

としています。これがいけないのでしょうか?

163:名称未設定
07/07/12 04:01:55 DjNHr2pC0
>>162
問題の切り分けくらい自分でやりなよ。
そこまで面倒みきれない。

164:名称未設定
07/07/12 04:02:28 byx4vDAn0
>>162
ちょっとやってみましたがnotificationがうまくとれなかったので;確認できませんでした。
申し訳ない。

165:名称未設定
07/07/12 09:45:28 0PLO2dIL0
>>162
これがいけないのでしょうかってそこをコメントアウトすれば、いけないかどうかくらいすぐわかるだろうが
他人にいちいち確認のコードを書かせる気か?

166:164
07/07/12 22:05:35 pjCoXtAi0
興味本位でやってみたんだけど、間違った行動だったと反省してます。
まぁ答え出てないから意味ないけど。

167:名称未設定
07/07/12 23:06:17 N2Qo+TtK0
Cocoa Bindingで質問です。
テキストフィールドの更新がBindingで行われるように組んだときに、
モデルの属性がごく短時間に何度も更新された場合、アプリがしばらく
固まってしまうのですけれども、これを解決するのに皆さんならどの
ような手法をとりますか?

>URLリンク(blog.so-net.ne.jp)

168:名称未設定
07/07/15 03:38:01 bqGSj8YO0
>>141
IB上でNSTableViewをダブルクリックして、
InspectorウィンドウのCustom Classde
MyTableViewに設定する。
シングルクリックだとNSScrollViewがフォーカスされるので注意。

169:名称未設定
07/07/15 03:38:59 bqGSj8YO0
すげー亀レスorz

170:名称未設定
07/07/15 15:09:30 iC/f5XUF0
NSPredicateで文字列「book」でフェッチしたあとに
「bookmark」など前回の文字列に付加した形の文字列で
フェッチするとひっかかりません。

毎回nilでクリアするしなかいのでしょうか?

171:名称未設定
07/07/16 07:20:46 qlrw2Rv40
やっぱり凝った事をやろうとすると手間だよな。orz
まあマクだからって簡単にプログラム作れる訳は無いのだが。

172:名称未設定
07/07/18 01:22:09 BRL0N5ZO0
すみません。基本の基本なのかもしれないのですが…

Objc01.m
Objc02.m
と、二つのクラスファイルがあったとします。

objec01.m
のinitメソッドの中で、例えば
MyObj* varInObjec01;
varInObjec01 = [ [MyObj* alloc] init ];
[varInObjec01 setVar:1];
などと、MyObj をvarInObjec01としてインスタンス化して
インスタンス変数を定義しました。
この時点で、objec01はvarInObjec01を持っていて、その中のVarには
1がセットされています。このVarは、objec01の別のメソッドで参照されたり
加工されたりします。

Objc02.mの別のメソッドの中で、objec01.m でインスタンス化した
varInObjec01にアクセスし、インスタンス変数 Var を取り出すには
どのようにすれば良いのでしょうか?
Objc02の中でobjec01をインスタンス化しても、別のインスタンスなので
同じインスタンス変数を持っていない状態になります。

どなたかお教えください。よろしくお願いします。

173:名称未設定
07/07/18 02:11:57 /hOqb68d0
>>172
どっか別のところでインスタンス化した object01 を
object02 から参照できる変数に保持しておけば済む話だろう。
object02 のインスタンス変数として保持するか
あるいはグローバル変数として保持するか
その方法は時々によって違うだろうが。

174:名称未設定
07/07/18 02:45:39 3sY2PtI30
便乗して質問しますが、
.hファイルの中で
@interface MyButton : NSButton
{
NSString *myParameter;
}
と宣言するのと、.mファイルの中で
@implementation MyButton
NSString *myParameter;
と宣言するのはどう変わってくるのでしょう?

175:名称未設定
07/07/18 03:58:40 ubS40ed30
前者はMyButtonのインスタンス変数で、後者は単なるグローバル変数

176:名称未設定
07/07/18 04:45:10 3sY2PtI30
どちらの場合も
-(NSString *)getString{
return myParameter;
}
みたいな感じで外部から取得したり、考えずに使えているので使い分けが分からないんです。
インスタンス変数とグローバル変数ググってきます。

177:名称未設定
07/07/18 10:03:54 8GU8wJyL0
>>176
ごく簡単に説明するとインスタンス変数は使っていいけどグローバル変数は使っちゃダメ

178:名称未設定
07/07/18 10:06:43 3sY2PtI30
>>177
分かりました。
そのインスタンスに持たせたいパラメータはちゃんと.hファイルに記述してインスタンス変数にします。
ありがとうございます。

179:名称未設定
07/07/18 11:17:24 Avgak43d0
「何のために」共通のインスタンスが必要なのかがわかれば、助言の一つも出せるのだが。

180:名称未設定
07/07/18 14:01:53 3sY2PtI30
>>179
例えば、.mファイルの中で

BOOL bool; //グローバル変数を宣言
- (void)method{
if(bool){} //処理1
else{} //処理2
}
- (void)changeBool:(BOOL)flag{
bool = flag;
}

という感じだとどうでしょう?
例えなのでmethod自体がBOOLをとるように書き直すというのは無しで。
普段パラメータは.hファイルの中に書いてるんですが、上の方で質問させていただいたように
使い分け、というかグローバル変数が好ましくない理由、状況がまだ今ひとつ掴めてません。。

181:名称未設定
07/07/18 14:26:05 Avgak43d0
根本的な部分が分かってないのか。
とりあえず、
BOOL bool;
は原則禁止!
static BOOL bool;
で。(もちろん例外はあるが今は考えなくていい)

で、 >180 は
あるインスタンスの動作を変更すればその属するクラスおよびサブクラスのすべてのインスタンスの動作が変更される
ことを意図しているのであれば正解。
但しその場合は意図を明確にするためインスタンスメソッドではなくクラスメソッドによって動作を変更するようにする。
- (void)changeBool:(BOOL)flag じゃなくて
+ (void)changeBool:(BOOL)flag

そうではなくて、インスタンスごとに別々の動作を持つようにするのであれば、間違い。


通常クラス定義ファイルに宣言定義された静的大域変数はクラス変数と呼ばれる。
クラス変数はすべてのインスタンスに共有されるため、その変更はすべてのインスタンスに影響を与える。
インスタンス変数はインスタンスごとに別のものとなるため、変更はインスタンスの中にとどまり他のインスタンスに影響を与えない。


182:名称未設定
07/07/18 20:19:29 3sY2PtI30
なるほど、凄く分かりました!試しにNSButtonのサブクラスの.mを以下のように記述し、ウィンドウに複数配置してみました。

static int parameter1;
- (BOOL)sendAction:(SEL)theAction to:(id)theTarget{
NSLog(@"parm1 %d", parameter1);
parameter1++;
return [super sendAction:theAction to:theTarget];
}

別々のインスタンスでもこのパラメータが共有されてることが分かりました。これがクラス変数なんですね。
今回元のメソッドの上書きで試しましたが、+のクラスメソッドで書く意味もよく分かりました。
これを知らないために今までボタンの全パラメータを変更する時に、ボタンの配列すべてに同じメソッドを送っていましたorz

183:名称未設定
07/07/18 21:03:40 3sY2PtI30
↑全ボタンのパラメータ、の間違いでした。
staticはよそから干渉されないように局所的な変数にする、staticをつけないと外部変数と理解しました。
試しに上記のコードからのstaticを外し、まったく同じコードの別のNSButtonのサブクラスを作ってみたら
ちゃんとパラメータが共有されました。凄く勉強になりました。ありがとうございました。

184:名称未設定
07/07/19 02:06:33 a3+jGlIB0
ちなみに,そのstaticを付けた変数を「クラス変数」という.

185:名称未設定
07/07/19 03:06:04 U9xJQ7gH0
Objective-C にはクラス変数なんてありません。

186:名称未設定
07/07/19 10:05:30 gCGzQvIn0
クラスオブジェクトが持つ変数はクラス変数じゃないのか?

187:名称未設定
07/07/19 10:16:57 A6zlNdun0
どんな教科書(資料)で勉強したの?

URLリンク(developer.apple.com)

しかし、クラスオブジェクトの変数を指定することはできません。つまり、インスタンス変数に対応する「クラス変数」はありません。...

... 一部のクラスは、静的な変数を宣言し、それらを管理するクラスメソッドを提供します
(クラス定義と同じファイルで static 変数を宣言すると、その有効範囲は当該クラスのみ、厳密には当該ファイルに実装されたクラスの部分に限定されます。
インスタンス変数と異なり、サブクラスは静的な変数を継承できません)。

188:名称未設定
07/07/22 10:56:58 rhiDTEck0
BOOL isNibLoaded = [NSBundle loadNibNamed: nibFileName owner: self];

という一行がうまく動かず困っています。
デバッガで追うと、この行に達すると、次の行以降のブレークポイントで
止まらなくなるので、ここで処理を抜けてしまっている感じです。

nibFileName には、正しく値が設定されているのですが、
nib が読み込まれていれば、表示されるはずのウインドウが
表示されません。

[NSBundle loadNibNamed: nibFileName owner: self]
が失敗するのは、どういうケースが考えられるでしょうか。

189:名称未設定
07/07/22 11:14:20 /m9PDaPq0
>>188
>nibFileName には、正しく値が設定されているのですが、
>nib が読み込まれていれば、表示されるはずのウインドウが
>表示されません。

本当に正しく値が設定されているという自信はあるのか?

190:188
07/07/22 11:45:38 rhiDTEck0
>>189
あります。

ちなみに nibFileName のところに、@"test" など、いい加減な string を入れると、
isNibLoaded には NO が帰ってきて、普通に次の行以降のブレークポイントへ
進みます。

上記を試してみて思ったのですが、nibFileName に指定している nib 内の
バインディングの設定に間違いがある、とか、そういうのかも知れません。

でもそれを確かめる方法や、nib(特にバインディングの設定)の良い
デバッグ方法がわかりません。


191:名称未設定
07/07/22 16:02:33 aRES5gfc0
awakeFromNib が loadNibNamed:owner: 呼び出し中に呼ばれるから、何か実装してるなら
それを一度コメントアウトしてみる。

nibファイルを一度、新規作成して何も変更してないものと置き換えてみる。

とかやってみるのはどうでしょう。

192:名称未設定
07/07/22 17:11:47 1Do/ZYGN0
その前にデバッガコンソールの存在に気づいているかが気になる。

193:名称未設定
07/07/22 17:24:50 rLqo+Xbu0
nib によって読み込まれるインスタンスの awakeFromNib 内に loadNibNamed: あると
無限ループになる

194:188
07/07/22 17:58:58 rhiDTEck0
>>191-193
ありがとうございます。

nib のバインディングの設定を一つ一つはずしていって、
バグの場所を発見できました。

nib のバインディングのデバッグにはいつも苦労するのですが、
何かもっと良いやり方はあるでしょうか。


>>191
awakeFromNib が呼ばれるのは、loadNibNamed:owner: が
「YES を返した後」ではないでしょうか。

今回のバグの場合、awakeFromNib の1行目に置いた
ブレークポイントにも到達しませんでした。

195:名称未設定
07/07/22 18:33:07 VUxjnHCb0
>>194
>バインディングのデバッグ
バインディングはあんまりやってないけど、consoleメッセージとexceptionはいているなら
gdb> break -[NSException raise]
でなんとかなってる。

196:名称未設定
07/07/22 22:26:11 gT1REgB20
CoreData の Document-based について質問です。

新しいデータが挿入されたときに初期値として、現在そのエンティティに
入っているデータの数を設定すると言う処理を考えています。

Document-basedの場合は、データのやり取りは、NSPersistentDocument
(MyDocument.mとします)の ManagedObjectContext を使う、と言う解
釈では間違えていますでしょうか?

まず、CoreDataモデルからサブクラスを作りました。(MyManagedObject.mとします)
この中の
- (void)awakeFromInsert
に、同処理を実装しようと思います。

MyDocument.m
MyManagedObject.m
二つの実装ファイルがある状態です。

awakeFromInsert の中で、MyDocument に実装した
- (void) setMyManagedObject:(NSManagedObject* )MyManagedObject
を、引数にself(MyManagedObject自身)を指定して呼び出します。

197:つづき
07/07/22 22:27:21 gT1REgB20
- (void) setMyManagedObject:(NSManagedObject* )MyManagedObject
内では、[self managedObjectContext]で取得したmanagedObjectContextで
総数を数えるときと、[MyManagedObject managedObjectContext]で取得した
もので数えるときでは結果が違います。

後者[MyManagedObject managedObjectContext]で処理したものであれば正確な
数が出ますが、前者[self managedObjectContext]で取得したものでは間違えた数字が
出ます。(0になります)

[MyManagedObject managedObjectContext]を使って処理した場合、
managedObjectContextが二つになってしまうせいなのか、nibファイル内でFile's Ownerに
指定したMyDocumentとBindingしているNSArrayController のアクション add: を使うと、
Tableviewには同じデータが二つ表示されてしまいます(表示だけ)

そもそも、サブクラスとして作ったMyManagedObjectは、MyDocument の
ManagedObjectContext を使わずに別の(独自の?) ManagedObjectContext を持つのでしょうか?
流儀として、どちらの ManagedObjectContext を使うべきなのでしょうか?

わかりやすく書こうと思って書いたのですが、伝わりますでしょうか…

198:名無しさん@そうだ選挙に行こう
07/07/29 09:08:45 ++cxbJD10
NSSliderからのアクションを
- (IBAction)myAction:(id)sender{
NSLog(@"action");
}
と受けると、スライダーのmouseDown、mouseDrag、mouseUpのタイミングでアクションが送られてくるようなのですが、
これを、この受け手側のmyAction内で分類できないでしょうか?
スライダーのサブクラスを作らなくてもこれらが分類できればいいなと思いまして。
御教授願います。

199:198
07/07/29 11:23:33 ++cxbJD10
自己解決
- (IBAction)myAction:(id)sender{
NSEvent *event = [[NSApplication sharedApplication] currentEvent];
if ([event type] == NSLeftMouseDown) {}
if ([event type] == NSLeftMouseUp) {}
}
のようにすればマウスの動作を分類できました。
しかしこの方法だとなぜか、重いQuickTimeMovieを動かしている時に
mouseUpの方を取りこぼしてしまうので、やっぱりスライダーのサブクラスを書いてみようと思います。

200:名称未設定
07/08/02 07:44:39 coNJlctT0
う~
NSMailDelivery でケータイに日本語メール送ると文字化けしちゃう。

deliverMessage:subject:to:
で送ったメールのヘッダを見ると、
Content-Type: text/plain; charset=US-ASCII; format=flowed
Content-Transfer-Encoding: base64
ケータイがデコードできないんでしょうね。

Cocoaはやっぱり!の
URLリンク(www1.big.or.jp)
を見ると、日本語メールは
Content-Type: text/plain; format=flowed; charset=iso-2022-jp
で勝手にエンコードされますよ、と書いてありますが、
Messageフレームワークの仕様が変わったのでしょうか?

deliverMessage:headers:format:protocol:
ならどうかと、ヘッダをセットして送信してみましたが、
Content-Type: は置き換わらないようです。

201:名称未設定
07/08/03 03:55:22 LeRHiyYZ0
>>200
関係ないかもしれないけど、Mail.app は言語環境を英語にして起動すると UTF-8 で送信される

202:200
07/08/03 06:14:19 9xPJ2l+O0
>>201
はい、言語環境が関係ありそうですが、日本語なんですよねえ。

しょうがないのでAppleScriptでMail.appつついて送信したら、
ISO-2022-JP で送れましたので、とりあえずこれで良しとします。

203:名称未設定
07/08/03 10:34:05 mJ4qs93D0
>>202

言語設定以外に、そのアプリが日本語にローカライズされててもダメ?

204:200
07/08/03 17:13:45 9xPJ2l+O0
>>203
はい、ローカライズしてます。
Localizable.strings(Japanese) から文字取れてますし、
Info.plist の CFBundleDevelopmentRegion を Japanese にしても一緒でした。
他に触るとこなかったかな?

205:名称未設定
07/08/03 18:39:40 RMVio4XF0
mail.appの文字コード自動判定がEudoraに比べて手厳しく
機種依存文字が含まれていると、
Content-Type: text/plain; charset=US-ASCII; format=flowed
Content-Transfer-Encoding: base64
になり、相当苦しみました。

素人なんで文字コードまでお勉強できてないのですが。。。

206:名称未設定
07/08/03 22:49:36 zBWSwrqo0
しかし NSMailDelivery ってどのぐらい Mail.app と連携してるんだろ。
なんとなく、単独で使えるようにはあまりメンテされてない感が...

しかし、今日び複数アカウントがあり、それぞれメールの送受信法が違うし、
メールの中身もいろんなものがあり、たかがメールを送るのも大変だよな。

207:名称未設定
07/08/04 00:06:43 N6Lu9KO20
NSMailDeliveryはAPIを見る限り、
貧弱すぎてMail.appでバリバリ使っているとは思えないよね。
NSMailDeliveryってヘッダ見ると1997のままだけど10年放置なの?
JavaMailレベルとは行かないまでも、もっと拡張してほしい。

208:名称未設定
07/08/04 09:56:01 zNZwO1rZ0
Cocoa Bindings で NSTextField に文字を表示させてるのですが、
表示させる文字を setValue: forKey: で更新すると、それまで表示していた文字と、
新しい文字とが重なって表示されてしまいます。

例えば今まで「十」の文字を表示していたところに、「口」の文字をセットすると
その2つが重なり合って、「田」みたいになってしまうのです。

バインディングの設定のせいなのか、コードに誤りがあるのかもわかっていません。
上書きされたはずの文字「十」は、誰が保持しているのでしょうか。


209:名称未設定
07/08/04 11:30:03 I4XWeUY/0
>>208
>新しい文字とが重なって表示
ウインドウリサイズ等して再描写しても?
Application delegateにKVを持たせ、NSButton>appDelegate action内でsetValue:forKey:してみたけど意図通りになった。

210:208
07/08/04 12:00:03 zNZwO1rZ0
>>209
ありがとうございます、再描画したらきちんと表示されました。
再描画せずにきちんと表示するには、何が足りないでしょうか。

211:208
07/08/04 12:01:03 zNZwO1rZ0
>>再描画せずに

すみません。
リサイズなどをしなくても再描画するには、何が足りないでしょうか。

212:名称未設定
07/08/04 12:51:34 I4XWeUY/0
>>211
setter(内で値の加工をしている?内で他のオブジェクトにsetしている?)やKVOを見直したほうが
いいと思うけど、再描写は
[nsview setNeedsDisplay: (BOOL)]
か(他のスレッドからなら)
[nsview display] または、[[nsview superview] display]

213:208
07/08/04 14:16:03 zNZwO1rZ0
>>212
setter は、

- (void) setName:(NSString *) aString {
[aString retain];
[name release];
name = aString;
}

となっています。
view に対して再描画させるとなると、
バインディングを使っている意味が薄れるので、
自分としても KVC/KVO で対処したいのですが‥。


214:名称未設定
07/08/04 15:32:11 I4XWeUY/0
NSValueTransformerサブクラスで(NSString*)valueを100回リピートする。"十"→"十十十…"
action内、setValue:forKey: を呼び出す所を1000回実行ってやってみたけど、重くなるだけで乱れは起きない。
負荷と思ったんだけど違ったか。(G4 single)
URLリンク(www.vipper.org)

>>213
>[name release]; // ここで[obj name]が呼び出されたら?
>name = aString;

- (void) setName:(NSString *) aString {
  id tmp = name;

  name = [aString retain];
  [tmp release];
}


+ (BOOL)accessInstanceVariablesDirectly を使っている?いない?

215:名称未設定
07/08/09 20:05:40 rPPfUlyN0
NSViewの上にNSImageを並べて表示させたいのですが、さっぱりです。


216:名称未設定
07/08/09 21:10:54 tas9QJXw0
Cocoa使ってるとよくCarbonのAPIを呼び出さなければならないことがありますけど、
いっそ入門Carbonとか読んでみた方がいいですかね

217:名称未設定
07/08/09 22:55:25 msAuLRcc0
>>214
ってゆうかそれだって例えば他のスレッドが [obj setName:]をほぼ同時に呼んだら
アウトだろ。

218:名称未設定
07/08/09 23:31:14 nEMt5Ylz0
>>214
NSMatrixでNSImageCellを使うのが手っ取り早い.

219:名称未設定
07/08/10 00:10:34 NXu0UGJP0
ループ内で座標にイメージのサイズを足せばいいだけじゃん

220:名称未設定
07/08/10 21:20:23 B2bpt6bp0
>>218 >>219
ありがとうございます。
NSMatrixで行列表示ができました。
でもなぜか、セルがウィンドウの上に切れて表示されるのと
putCell:atRow:column:でNSImageCellで画像をセットしても
同じ画像ばっかり表示されるんです。

もう少し勉強してみます。

221:名称未設定
07/08/10 23:22:04 NXu0UGJP0
>>220
NSMatrixにaddRow/addColumnして、[self cellAtRow:y column:x]に対してイメージをセットしたらどうかな

222:名称未設定
07/08/10 23:23:05 NXu0UGJP0
selfはNSMatrixね

223:214
07/08/11 01:19:20 4MGmk/Il0
なんかちぐはぐなレスになった>>214はあぼーんで。スレ汚しスマソ
>>217 指摘thx.

224:名称未設定
07/08/11 01:27:56 uNrauIzq0
220です。
自己解決できました。
NSScrollView内にNSMatrix作ったら左上から右下に向かって綺麗に並びました。
重複画像は単純にNSImageのalloc/releaseの記述ミスでした。

NXu0UGJP0さん、ありがとうございます。

次は画像の影付けにチャレンジ。
これまた難易度が高そうです(^^;
NSImageにaddShadowとかあったら楽なのになあ。


225:名称未設定
07/08/13 19:32:35 HjQoWJR20
NSSegmentedControlをクリックした時、デフォルトだとマウスアップ時に選択が移行するのですが、
これをマウスダウン時のタイミングで選択を変えるにはどうしたらいいでしょう?
sendActionOn: メソッドを使ってみたのですがうまくいかず
今はマウスダウンの中を書き換えようとしてるのですが、
NSTabViewのtabViewItemAtPoint メソッドのようなものがNSSegmentedControlにはなくどうしてよいものか分かりません。
御教授よろしくお願いします。

226:名称未設定
07/08/15 00:34:56 eYK2hRJc0
サブクラスで

- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseUp:theEvent];
}

- (void)mouseUp:(NSEvent *)theEvent
{

}
としてみるとか.

227:名称未設定
07/08/15 04:21:23 FI0rPcR60
NSSliderなんかと同じでNSSegmentedControlにはmouseUpが実装されてないので
例えばサブクラスで
- (void)mouseUp:(NSEvent *)theEvent{
NSLog(@"MouseUp");
[super mouseUp:theEvent];
}
としてもここに処理が回ってこないんです。
なので>>226のコードだと何も処理されないんです。。
正確にはNSSegmentedControlにmouseDownは継承されてるけど
オーバーライドされて機能しないようになってるってことだと思いますけど。

228:名称未設定
07/08/15 06:42:46 xHhBTOGd0
NSSegmentedCell (NSCell)の
sendActionOn あたりを変更してみるとか?

229:名称未設定
07/08/15 06:43:45 xHhBTOGd0
既出だったかスマン

230:名称未設定
07/08/15 10:34:54 g4ql7t+80
普通にこの辺じゃないの?
-[NSCell trackMouse:inRect:ofView:untilMouseUp:]
-[NSCell startTrackingAt:inView:]
-[NSCell continueTracking:at:inView:]
-[NSCell stopTracking:at:inView:mouseIsUp:]

かなり面倒くさいけど。

231:225,227
07/08/15 15:37:59 PbdqCUHT0
ありがとうございます、とりあえず現状
-(void)mouseDown:(NSEvent*)theEvent{
NSPoint point = [theEvent locationInWindow];
point = [self convertPoint:point fromView:nil];

int i, w = 0;

for (i=0; i < [self segmentCount] && w < point.x ; i++) {
w += [self widthForSegment:i];
}
[self setSelectedSegment:i-1];
}
でやってます。
セグメントのサイズをIB上でAutoSizeにしてるとwidthForSegmentが0を返すので不完全です。
もっとスマートな方法があれば是非。

232:名称未設定
07/08/16 17:16:23 cDPUZH1x0
oomori.comってどうなったんだ?

233:名称未設定
07/08/16 17:23:26 D7uzhTeg0
先日つながらなくなって、一時復活したようだけど
それからまたつながらなくなったみたい
どうしちゃったんだろうね

234:名称未設定
07/08/16 17:57:18 5J/T/ZnQ0
愛想を尽かしたんじゃないかな。

235:名称未設定
07/08/18 19:33:59 b9e4iKE/0
URLリンク(www.haloscan.com)

236:名称未設定
07/08/18 19:39:50 qe4k9HGL0
cocoaで飯食ってけますか?

237:名称未設定
07/08/18 20:25:28 xDpeu2aa0
Cocoaは嗜好品であって主食にはなりません。

238:名称未設定
07/08/19 00:50:40 wXs7PQ2p0
>>235
面白いけど、MyCOMの記事への指摘を何故日記のコメントにするのか分からんな。

239:名称未設定
07/08/19 01:52:34 wwtSg7AR0
mkimoさん?

240:名称未設定
07/08/19 06:35:14 b5TCkvsd0
mkinoってエムキノって読むの?

241:名称未設定
07/08/19 08:21:45 x6297PUr0
>>238
俺も思た。
しかもコメント先はツールバーアイコンに関するエントリで、
マイコミは何にも関係ないんだもんな。
メールでもなんでもすりゃいいものを、ちょっとマナー悪いように思う。

242:名称未設定
07/08/19 09:13:46 fHLqYkOZ0
ダイナミックObjective-Cへの突っ込みにHMDTの最新エントリのコメント欄使う奴はけっこうよく見るだろ。

243:名称未設定
07/08/19 09:34:24 x6297PUr0
>>242
そーいうもんなのかな? 俺が自分のサイトでやられたらあんまり良い気分じゃないけど。
あまりにも主題と関係のないこと書かれたら、後からそこ探すの大変だし。
ま、時々見かけるmkinoマンセー連中もウザいし、どうでもいいんだけど。

244:名称未設定
07/08/19 09:44:23 etpi/Mpi0
>>239
わろた。
実物見たことないが、キモいのかw

245:名称未設定
07/08/19 11:40:02 ocPOSWi+0
コメント欄で主題と異なることを書き込むのは俺もマナー違反だと思うよ。

でも、Macでプログラム系の掲示板がどこかほしいな。検索機能付きのやつ。
HMDTにあった掲示板もスパムでやられて閉鎖されちゃったし、やっぱり
運営難しいのかな。こんな感じのがあればいいのに。
>URLリンク(www.atmarkit.co.jp)

246:名称未設定
07/08/19 12:35:59 fZdGSCkT0
質問です。
10.4以降ではstringWithContentsOfURL:ではなく、
stringWithContentsOfURL:encoding:error: または
stringWithContentsOfURL:usedEncoding:error:
を使えと書いてあるのですが、うまくいきません(nullが返ってくる)。

*strConnURLは入力されたURL
NSURL *connURL = [NSURL URLWithString:strConnURL];

NSString *retString = [NSString stringWithContentsOfURL: connURL];
-> retStringにHTMLが返ってくる。
NSString *retString = [NSString stringWithContentsOfURL: connURL encoding:NSUTF8StringEncoding error:nil];
-> retStringにnullが返ってくる。

当方10.4.10 Xcode 2.4.1です。

どこが悪いのかさっぱりです。

247:名称未設定
07/08/19 13:24:40 L1niG0WF0
エンコードがUTF-8じゃないんですか?

エンコードが分からないときは
+[ NSString stringWithContentsOfURL:usedEncoding:error:]
を使ってください。

聞く前に NSError を返してもらって調べるくらいしましょうね。

248:名称未設定
07/08/19 17:56:55 fZdGSCkT0
>>247
できました。ありがとうございます。

NSShiftJISStringEncodingと入れて、
いろいろとサイトのURLを入れて試してみたのですが、
取れるサイトと取れないサイトがあるようですね。
自分のサイトのCGIと連携させるので決め打ちでも問題ないのですが。

精進します。

249:名称未設定
07/08/19 22:17:57 GJetEexT0
>>248
NSURLRequestとかも試してみたら?

250:名称未設定
07/08/20 00:06:56 sNRA//U50
>>245
PukiWikiなら設置してある。
放置気味だけど。
URLリンク(cocoawiki.aerial.st)

251:名称未設定
07/08/20 03:27:37 VX9jayCX0
NSOpenGLViewが複数あるとき,一個のViewの方でpickしたら
もう一個のViewが描画されなくなるんだけどなんでだろう。
glRenderMode(GL_SELECT);

gluPickMatrix
を実行しないと問題無い。

その後は
glRenderMode(GL_RENDER);
にちゃんと戻している。



252:名称未設定
07/08/20 09:02:13 XvOlYfuG0
>243
実際あの指摘は正しいんだろか?
初心者の漏れにはサパーリわからんのだけど。

253:名称未設定
07/08/20 22:17:07 t64RIRSP0
>>252
サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?


見たところ、デザインパターン自体からは多少逸脱して、
ObjC/Cocoaでの類似の機能やその実現の説明に入りかけているように見える。
これはこれで見えてくるものがあるはずなので今後の展開に期待。
ご本人もあえてそういう感じの意識で連載をしているようだ。

Commandに関しては最初の方でNSDocumentを例に使っているので、
今後もその流れでいくのかな。

最終的に「Cocoaパターン」とでも呼べるものが出来上がったら面白いなあと思う。
し、もしかするとそんな将来の著作も狙ってたりして。

254:名称未設定
07/08/20 22:23:05 t64RIRSP0
なんだ、ADCサイトに既に元ネタちっくなものがあるじゃないか...
あとはそれをどこまで膨らませて(いい意味で)書けるかだなあ。

255:名称未設定
07/08/20 22:27:39 t64RIRSP0
連投すまん。>>254のことはデザパタ関連の連載の最初にすでに断ってあった。
だから本人もそれを単純に踏襲したものにならないように書いてる筈だと期待。

256:名称未設定
07/08/20 22:30:46 XG0wpyE80
え?
期待してんの?


257:名称未設定
07/08/20 22:31:52 m/MJ9Do70
アクセス数の多いサイトの、本来は何の関係もないページトップのエントリに対して、
わざわざ自分のサイトへのリンクを記載してコメントするのはちょっと気が引けるな。俺は。
なんか宣伝みたいになっちゃうじゃん? 「こんな鋭いツッコミする俺ってどう?」みたいな。
ある程度気心の知れた常連さんみたいだし、そういう意図はないんだろうけど。
といいつつ、話の展開は気になる。

258:名称未設定
07/08/21 07:51:32 6qziaugl0
>253
>サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?

フツーに野次馬なだけです

259:名称未設定
07/08/21 20:44:58 68zc4QPq0
QTKit についての質問です。サンプルコードの'QTKitCreateMovie' の通りに
CreateMovieStorage を使ってNSImage からQTMovieを作ったのですが、
画面左上にQTMovieが予期せず表示されます。
Technical Note TN2138 をみると、同じ事例なのかどうかは分かりませんが、
FAQとして似たようなものが載っていましたので、gworld を作成し、
CreateMovieStorage の直前に入れました。
が、相変わらずQTMovieの最後のフレーム?が表示されます。
Expose などで画面の再描画が行われると消えるのですが、気持ちが悪いので、
解決策をお教えください。
Movie qtMovie = NULL;
GWorldPtr gworld = NULL;
Rect rect = {0, 0, 1, 1};
NewGWorld(&gworld, 32, &rect, NULL, NULL, 0);
SetMovieGWorld(qtMovie, gworld, NULL);
CreateMovieStorage(…
とやってます。
URLリンク(developer.apple.com)


260:名称未設定
07/08/22 11:48:33 09zetXWR0
>>259
SetMovieGWorld は CreateMovieStrage の後なんじゃね?
qtMovie が NULL の状態で SetMovieGWorld しても意味ない気がする。

Movie 作っても表示はされなくて、インスタンス化してから表示されるんじゃないか?


261:名称未設定
07/08/22 13:46:57 JadCL/7H0
>>260
ありがとうございます。仰る通りにCreateMovieStrage(…) の後に SetMovieGworld(…) を
やってみましたが、同じ結果でした。
で、関係する関数を調べてみたんですが、NewGWorld(…) が OSX10.4 で廃止されていました。
コンパイルエラーも実行時エラーも出てなかったので通っているものとばかり…
代わりの関数って何になるんでしょうか?
もちろん自分でも調べてみますが、ご存知でしたらお教えください。

262:名称未設定
07/08/22 14:11:21 fw6+crbU0
廃止?廃止予告じゃないの?

263:名称未設定
07/08/22 21:59:05 dvhT81p60
>>261
というか、関数のエラーチェックをしてないのでは?
どこで引っかかっているかはきちんと確認したか?

そのケースは普通GWorldがきちんと出来ていないか
Setではねられているかどちらかでは。

264:259
07/08/23 00:56:08 xQ3xY0pg0
>>262
廃止予告なんですか、知りませんでした。最近始めたばかりなんで良く分かってないんです。
勉強になりました、ありがとうございます。

>>263
ありがとうございます。
GWorldは出来ている…とおもいます。NewGWorld() の後で値を持っているので。
SetMovieGWorld の直後に GetMovieGWorld をやってみたのですが、返って来た GWorldPtrが
gworld と違っています。Set出来てないって事なんでしょうね。ということは、gworldがちゃんと
出来てないって事なんでしょうか??うぅ…Cocoaの勉強しかしてないので全く分からない…
GWorldPtr gworld = NULL;
GWorldPtr ggwrld = NULL;
Rect rect = {0, 0, 1, 1};
NewGWorld(&gworld, 32, &rect, NULL, NULL, 0);
SetMovieGWorld(qtMovie, gworld, NULL);
GetMovieGWorld(qtMovie, &ggwrld, NULL);

お手数をおかけしました。
作った QTmovie 自体はちゃんと書き出せているのでちょっと我慢して、もう少しQuickTime、
QuickDraw(これからはQuartz2Dの方が良いのかな?)を調べてからもう一度チャレンジしたいと
思います。アドバイスして下さった方々、ありがとうございます。

265:名称未設定
07/08/23 08:39:50 MFvh7UHN0
既に解決していたらよけいなお世話だが、
ちょっと最初のソース>>259を見ていて気になったんで、、、
SetMovieGWorldで設定しているqtMovieは実際描画を行っているQTMovie
(こっちはQTKitの方ね)を指している?

CreateMovieStrageはQTKitの関数ではなくTraditionalなQuickTime
の関数なので、どこかでこのStorageをQTKitのQTMovieに変換する
ためにmovieWithQuickTimeMovieとかを呼んで実際に描画をしている
QTMovieを作っているはずなんだけど、このパラメータとして使って
いるMovieに対してSetMovieGWorldをやらないと意味ないよ。

実際の所CreateMovieStrageに対応するQTKitの関数が無いのが問題
なんだけどね、いまQuickTimeに手を出すのはカオスに手を出すよう
なものだから必要に迫られていないのならばQTKitがもう少し充実す
るまで待った方が良いような気がする。


266:名称未設定
07/08/23 09:28:42 b2guyxFU0

QTKitは試していないけど

URLリンク(lists.apple.com)



267:名称未設定
07/08/23 09:58:55 7IM/N5ND0
>>265
それだね。QTKitCreateMovieのサンプルソース見ると
quicktimeMovieFromTempFileでストレージを作る際に
新規Movie構造体を一緒に作って、かえってきたMovieを
使ってQTMovieインスタンスを生成してる。

別のMovie構造体にセットしてもそりゃだめだな。

268:259
07/08/23 11:59:41 xQ3xY0pg0
>>265, 266, 267
おおおぉ、ありがとうございます!解決致しました。
quicktimeMovieFromTempFileから返って来たMovieについて、SetMovieGWorldをかけ
QTMovieを作ったら見事に消えました。厚くお礼を申し上げます。

>いまQuickTimeに手を出すのはカオスに手を出すようなものだから
確かに、そんな気分になりました…こういうのが carbon の世界なんでしょうか?

何はともあれ、つきあって下さった皆様本当にありがとうございます。

269:名称未設定
07/08/23 13:14:35 MFvh7UHN0
>>268
Carbonの世界はCarbonの世界で悪くないよ。Appleは終息方向に向かいたいみたい
ですけどね。

単にQTKitが未完成でTraditionalな関数を呼ばないと実現できない事が多すぎて、
何をやるにもちょこちょこCarbonが顔を出すので、CocoaからQuickTimeにアプロー
チするのが「カオス」。

Carbonだけで閉じた世界で使う分には「今の所」QuickTimeは普通に使える。将来
は逆にCocoaに手を出さないと機能が使い切れなくなると宣言されてるけどね。

まあ、Carbonはここではすれ違いだ。失礼しました。


270:名称未設定
07/08/23 16:40:07 tUB6r9Qr0
てことでObjective-C2.0のQTKitに期待なわけですね。

271:259
07/08/23 18:29:02 xQ3xY0pg0
>>269, 270
なるほど、Carbon からは QuickTime が使い易いんですね。
Leopard の QTKit が使い勝手よくなっていることに期待します。
後2~3ヶ月か。うーん早く出して欲しいなぁ。

272:名称未設定
07/08/24 13:00:09 plQI0uRV0
>>269

判ってると思うけど、QuickTimeはCarbonじゃ無いよ。
GWorldとは手を切って、OpenGL Contextに移行しよう。

273:259
07/08/24 17:12:35 9ylc1pF50
>>272
これは私宛(>259)、ですよね。この辺り分かっていないんで、間違っていたら教えて頂けますか。
周囲に聞ける人がいないので、Appleの文献とネットしか(ヒレガス本と荻原本はよんでます)
情報が無いんです。教えて君状態で申し訳ないのですが、よろしくお願いします。
1.SetGWorldはQuickDrawのメソッドで廃止予定。Quartz2Dが代わりになる。
2.Quartz2D (CoreGrahicsの一部?), CoreImage, CoreVideo, CoreGraphicsの下にOpenGLがいる。
3.QuickTimeは3つの上にあって、描画対象や処理に応じて3つのAPIを使っている?
4.3つのframeworkはそれぞれOpenGLの一部の機能を提供?OpenGL非依存の処理も可能?
5.CocoaからはQuartz2D CocoaAPIを介してOpenGL Contextが作れる?(一番分かってないです)
という風に理解しているのですが、合っていますか?

274:名称未設定
07/08/24 18:05:34 plQI0uRV0
Creating a Visual Context
URLリンク(developer.apple.com)

QTNewGWorld => QTPixelBufferContextCreate or QTOpenGLTextureContextCreate
Visual Contextは、普通のメモリーか、OpenGLのテクスチャ。

SetMovieGWorld => SetMovieVisualContext

CIVideoDemoGL
URLリンク(developer.apple.com)


以下僕も曖昧ですが。
Quartz2D: PDFベースの描画命令。QuickDrawの後継。2D ExtreamならGPU使う。
CoreImage: GPU使った画像処理フィルター。テクスチャに施す。
CoreVideo: 複数のテクスチャをバッファプールに使ってムービーの表示タイミングをモニタのリフレッシュに合わせる仕組み(Display Link)。

要はみんなテクスチャなんでGPUの中だけで相互にいじれると。

275:名称未設定
07/08/24 20:07:50 jUBSvJSS0
CoreVideoPixelBufferってGLテクスチャだけでなく、
GWorldのラッパも兼ねてると思ってた。

RGBでないDecompressor/CompressorComponentは2vuyを
デフォルトでつかうから、結局一発目のCoreVideoPixelBufferは
GWorldベースになっちゃうはず

QuickTimeのyuvデフォルトはChunky yuv=2vuy(422)で、PlanerYUVじゃ
ないからPixelBuffer間の変換処理がぼこぼこ起きると遅くなると思う

Sharkで見ると、いったんChunky yuv422ー>Planer yuv444ー>RGBとか
やってるっぽい
CoreVideoが、DisplayLinkの途中でGLテクスチャに変換してるん
だろうと思うんだけど、すごく無駄が多く感じるんだよね



276:名称未設定
07/08/25 01:30:41 VopUGkEZ0
>>275
MyCometG3氏と見た。

277:259
07/08/25 19:15:58 NJSbpzvW0
>>274,275
うーん、覚えないといけない事がいっぱいですね…一つずつ学びたいと思います。
ありがとうございました。

278:名称未設定
07/08/28 07:04:19 zHr/kI630
初歩的質問で申し訳ないのですが、NSString文字列の
制御文を書きたいのですが、どのようにすればいいのでしょうか。

NSString* hoge;
hoge=@"あいうえお";

if (hoge =@"あいうえお") {
//もしhogeの内容が あいうえお ならここのコードを動作させたい
}

のように書いたのですが、if の行でエラーが出てしまいます。


279:名称未設定
07/08/28 07:09:19 Xv9pLU0Y0
>>278

if (hoge isEqualToString:@"あいうえお") {

280:名称未設定
07/08/28 07:11:51 lNlMIRDY0
朝からcocoa
いいね素晴らしいね

281:名称未設定
07/08/28 07:16:01 zHr/kI630
>>279
分かりました。勉強不足でした。

ありがとうございます。

282:名称未設定
07/08/28 12:58:25 y/omrr0P0
>>279
@""の中に日本語はまずくないですか?

あえてソースの中に日本語書くのならエンコードをutf8にしておいて、

if ( [hoge isEqualToString:[NSString stringWithUTF8String:"あいうえお"]] ) {

}

くらいでは。

283:名称未設定
07/08/28 13:13:32 rN2eIabO0
>>278
この例だと、>>278が意図したようには動かないが、エラーも出ないのでは。

284:名称未設定
07/08/28 13:28:47 qboyE3Nc0
オブジェクト定数に日本語使ったからエラー出たんじゃね?

285:名称未設定
07/08/28 13:54:14 p7clQF4e0
その前に条件式内での代入は不問なの?

>のように書いたのですが、if の行でエラーが出てしまいます。
どんなエラーかも分からないし。

286:名称未設定
07/08/28 15:04:49 y5W8OHwo0
パールや簡易系スクリプト上がりだと苦労するよ。オブジェC。


287:名称未設定
07/08/28 15:42:39 KiMzdaU00
CocoaDevCentralあたりにPHPからの移行チュートリアルみたいなのあった気がする。
英語だが。

288:名称未設定
07/08/28 15:57:17 qboyE3Nc0
うそん
俺AppleScript上がりだけどすんなり理解できたよ、ObjC

289:名称未設定
07/08/29 03:40:32 QhQnuPQW0
Cocoa初心者です。
ヒレガス本(日本語版)は、済ませました。
次にやると良い入門書があれば、ご紹介ください。


290:名称未設定
07/08/29 13:43:03 6vtaxeAX0
>>289
何を作りたいの?

291:名称未設定
07/08/29 19:40:33 mCpcDP8p0
テーブルビューでコアデータにバインドしないカラムのソート方法がさっぱりです。

ソート用にそのカラムの配列を作ってソートディスクリプタをかますのですか?

292:名称未設定
07/08/29 19:50:19 sxJk1+Ic0
NSTableView の - (NSArray *)sortDescriptors;
NSMutableArray の - (void)sortUsingDescriptors:(NSArray *)sortDescriptors;
がヒントというか殆ど答え。

293:名称未設定
07/08/29 20:15:26 FVUVQ2w00
NSTextFieldについて質問させてください

Interface Builderの設定でLayoutがWrapsの場合(Viewの幅で自動改行)に、
横幅を変えずに高さだけ変えてテキストがちょうど収まっているように
プログラムでリサイズさせるにはどうしたらいいでしょうか?

[NSControl sizeToFit]だと横幅が変わってしまいます

294:名称未設定
07/08/30 01:39:01 8W/XnYIW0
>>291
URLリンク(blog.so-net.ne.jp)

295:名称未設定
07/08/30 01:47:09 8W/XnYIW0
>>293
IBのインスペクタのサイズで,
NSTextFieldのサイズを上下にリサイズするように設定してみては.
上下にはバネ,左右は直線の表示に.

296:名称未設定
07/08/30 02:23:58 zfQNQU460
>>294
そこに書いてあることは間違ってるとは言わんが
すごく誤解を招きそうな感じの書きっぷりになってるな

297:293
07/08/31 00:21:20 coa9p3Qi0
>>295
ダメでした。IBの「Size to Fit」メニューではAutosizing設定に
合わせてくれるんですが、プログラムでは

[textField setStringValue:@"とても長~~~~い1行"];
[textField sizeToFit];

としても横に長く伸びてしまいます

298:名称未設定
07/08/31 03:54:43 k2mfVNs40
>>297
NSTextFieldのsetLineBreakMode:でラップするよう設定してみては?
詳しくはリファレンス参照.

299:293
07/08/31 23:09:17 coa9p3Qi0
自己解決しました。これでできそうです。

NSRect fr = [textField frame];
fr.size = [[textField cell] cellSizeForBounds:[_textField bounds]];
[textField setFrame:fr];

300:名称未設定
07/09/01 17:23:27 V20HLbnL0
>>292 >>294
回答ありがとうございます。
チャレンジしてみます。

301:名称未設定
07/09/02 16:01:51 1W/RX5JH0
NSTableView(NSArrayController)で最後にソートしたカラムとソート順をアプリの終了時に保持して、
次回起動時に前回の状態でソートするにはどうすればよいのでしょうか?

[[[NSArrayController sortDescriptors] objectAtIndex:0] description]

をNSStringに代入してプロパティリストに保存できたのですが、
なんか無理矢理なやり方かなと。

良い知恵がありましたらお願いします。

302:名称未設定
07/09/02 17:36:24 QfZEBWjg0
自分で変数もってそれをプロパティリストに保存して起動時にソートしなおすとかは?
とNSTableView使ったことないけど言ってみる

303:名称未設定
07/09/02 23:43:35 BsNs+MD5P
descriptionで保存するんじゃなくて、sortDescriptorsにNSArchiver使った方がいいんじゃない?
で次回起動時にはNSUnarchiverを使って復元したものをsetSortDescriptors:して再ソート

304:名称未設定
07/09/03 01:24:15 d9shAoB60
ass乞食がcocoaのhtmlレンダーマンを掘り当てたらしいね

305:名称未設定
07/09/03 01:34:14 J1vhJrBi0
中国人は赤ん坊も食べる
URLリンク(www21.tok2.com)


306:名称未設定
07/09/07 21:36:25 EENbuIBN0
ああ、さっぱりわからないよ兄さん。

307:名称未設定
07/09/11 23:43:45 8nKQQObl0
NSPredicateで" カラム=='値' "というのはできるのですが、
" 関数の返り値=='1' "みたいなことは出来るのでしょうか?
よろしくお願いします。


308:名称未設定
07/09/12 20:54:55 0PGJU/k/0
またHMDT恒例の、エントリ無関係ツッコミが始まりましたな。

309:名称未設定
07/09/12 21:50:19 f0yZ2CXF0
>>307


オブジェクトobj の関数(メソッド)func が数字を返すとき、

BOOL result = [[NSPredicate predicateWithFormat:@" func == 1"] evaluateWithObject:obj];

みたいなこと?そのまんまだけど



310:名称未設定
07/09/13 09:13:13 tYOZKWhg0
Core Dataを使って、非常に簡単なアプリを作ろうとしています。
単語帳みたいな感じのものなんですが、
Cardエンティティ:
- 属性word (String)
- 属性meaning (String)
というデータを持っています。
例えば、(word, meaning) = ("hello", "こんにちわ")みたいに格納します。

さて、wordの表示は左側にNSTableColumnでリスト表示させ、
その右側にNSScrolViewでselectされた単語の意味を表示させます。
このとき、NSScrolViewから意味を編集したいのですが、
この中身を日本語のプレインテキストにしたと思っています。
属性meaningのタイプはStringのままでいいのでしょうか。
Stringにすると、実行時に右側のNSScrolViewを編集することができなくなります。

そこでタイプをバイナリデータにしてみたんですが、
当然、作成されたXMLの中身がバイナリになって可読性が悪くなります。
タイプをStringのままで、NSScrolViewを編集できるようにするにはどうしたらいいでしょうか。

311:名称未設定
07/09/13 10:03:32 tYOZKWhg0
すいません。
ごにょごにょやってたら出来ました。
何をやったのかは分かりませんorz

312:名称未設定
07/09/14 03:22:19 vPRPlLH90
まず、NSScrollViewから編集したつもりになってるようだけど、
実際はNSScrollViewの内部にあるNSTableViewから操作している。
NSScrollViewはスクロールを可能にするだけの縁取り的なものに過ぎない。
だからもしリファレンス等で調べるなら、
NSScrollViewではなくNSTableViewを参照すること。

次に、保存方法と編集可能云々は別問題なハズ。
Interface BuilderでNSTableViewのインスペクタのEditableとか
いろいろいじったんじゃない?

313:名称未設定
07/09/14 11:37:14 gUdBg/zp0
今回発売されたLogic 8は1000p以上の翻訳済みマニュアル付いてるそうな
世界同時発売で

で、Cocoaリファレンスの翻訳はまだですか?

314:名称未設定
07/09/14 13:29:15 sFJVO0iJ0
>>313

Cocoa Break

315:名称未設定
07/09/14 18:33:16 ZI20taVc0
cocoa breakは神

316:310
07/09/14 20:03:38 5NLP9ylV0
>>312
NSScrollViewは勘違いでした。
どこを弄ったのか良く分からなかったので、
何度か新規でプロジェクトを作り直したりしたら動いています。
今は何と何をバインディングさせたか理解してるんで、
ちゃんと正しいことをやってるくせぃ。

317:名称未設定
07/09/14 23:10:21 +9nlJNpQ0
俺をAppleで働かせてくれるなら死ぬ程翻訳しまくってやってもいい
とほざく求職中の俺

318:名称未設定
07/09/17 21:49:27 5CFLrUlr0
日本語入力 �フ 英語入力 をアプリの中から切り替えるには、どうすれば
よいでしょうか。

URL を入力するテキストフィールドがあって、そこが入力状態になったときに
自動的に英語入力に切り替わるようにしたいと思っています。


319:名称未設定
07/09/17 22:47:37 vp+tEm1m0
たぶんそういうのはCarbonの中の古いAPIを使うんじゃないかな

320:名称未設定
07/09/19 12:44:09 QAAMlS8c0
Core Dataで名前と住所があるとして、NSTableViewで表示させるとします。
で、カラムは名前と住所を表示させるんだけども、
住所が未入力の人は名前を赤で表示させたい。
これってどうやればいいんでしょうか。

321:名称未設定
07/09/19 16:00:49 7OHnYPwj0
>>320
●NSTableView に delegate を設定して tableView:willDisplayCell:forTableColumn:row: の中で、
住所の中身を調べて名前のセルに setTextColor する。

●もしくは、下記の2つのファイルを作り、プログラムのどこか最初の方で(applicationDidFinishLaunching等の
メッセージを受けて)、以下のように

MyValueTransformer* transformer = [[[MyValueTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"MyValueTransformer"];

独自の値変換を登録しておく。Interface Builder では、名前カラムのbindins -> textColor -> Value Transformer に設定しておく。

322:名称未設定
07/09/19 16:01:37 7OHnYPwj0
長過ぎて怒られたので分割。

//---------- MyValueTransformer.h ----------
#import <Cocoa/Cocoa.h>

@interface MyValueTransformer : NSValueTransformer {

}
+ (Class)transformedValueClass;
+ (BOOL)allowsReverseTransformation;
- (id)transformedValue:(id)value;

@end

323:名称未設定
07/09/19 16:02:40 7OHnYPwj0
//---------- MyValueTransformer.m ----------
#import "MyValueTransformer.h"

@implementation MyValueTransformer

+ (Class)transformedValueClass {
return [NSColor class];
}

+ (BOOL)allowsReverseTransformation {
return NO;
}

- (id)transformedValue:(id)value {
if ( value != nil && [value respondsToSelector:@selector(length)] && [value length] > 0 )
return [NSColor blackColor];
else
return [NSColor redColor];
}

@end

324:名称未設定
07/09/19 16:09:53 7OHnYPwj0
念のため名前カラムの Bindings の中ね。

Bind to: NSArrayController
Controller Key: arrangedObjects
Model Key Path: (住所の入っているプロパティ名)
Value Transformer: MyValueTransformer

325:320
07/09/19 20:31:54 QAAMlS8c0
>>321
まんま使わせてもらいました。
ありがとうございます。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;
をHoge_AppDelegate.hに足して、
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
WordColorTransformer* transformer = [[[WordColorTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"WordColorTransformer"];
}
をHoge_AppDelegate.mに足しました。

初めてD&D以外の作業をXcodeでやったわw
C/C++しか触ったことないんだけど、Cocoaの思想みたいなもんが見えてきた。
これは便利そうだ。

326:320
07/09/19 20:36:30 QAAMlS8c0
すいませんが、もう1つ。

名前カラムに新規登録する度に、
headerを押さないでも自動でソートさせるのは、
どうすればいいんでしょうか。

327:名称未設定
07/09/20 01:30:49 r/uaSxxr0
>タップ……指で軽く叩く操作。マウスのクリックに相当
>ダブルタップ……2回叩く操作。ダブルクリックに相当
>ドラッグ……写真を移動する時に指をずらす操作
>フリック……リストをスクロールする時に指で軽くはらう操作
>ピンチ……2本指でのつまむ操作の総称
>ピンチアウト/ピンチオープン……2本指の間を広げて拡大する時の操作
>ピンチイン/ピンチクローズ……2本指の間を縮めて縮小する時の操作
URLリンク(k-tai.impress.co.jp)

- (void)touchFlicked:(NSEvent *)theEvent;
とかになるのかな?

328:名称未設定
07/09/20 11:06:40 CMoMWviD0
>>326
とりあえず思いつくのは notification を使うことかな。

IB で Hoge_AppDelegate に Outlet を2つ追加して接続。ここでは仮に arrayController(NSArrayController に接続)と
tableView(NSTableView に接続)としておく。

Hoge_AppDelegate.h に追加。

IBOutlet NSTableView *tableView;
IBOutlet NSArrayController *arrayController;

Hoge_AppDelegate.m を修正。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
MyValueTransformer* transformer = [[[MyValueTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"MyValueTransformer"];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectChanged:) name:NSManagedObjectContextObjectsDidChangeNotification object:nil];

NSArray* sortDescriptors = [NSArray arrayWithObjects:
[[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES] autorelease],
[[[NSSortDescriptor alloc] initWithKey:@"address" ascending:YES] autorelease],
nil
];
[tableView setSortDescriptors:sortDescriptors];
}

- (void)objectChanged:(NSNotification*)notification {
[arrayController rearrangeObjects];
}

329:名称未設定
07/09/20 11:12:40 CMoMWviD0
>>326
dealloc の中で後始末もしておいて。一応、マナーとして。

[[NSNotificationCenter defaultCenter] removeObserver:self];

330:名称未設定
07/09/20 22:29:15 A01fsnmG0
iPhone、iPod に OS X を内蔵したおかげで、Cocoaプログラマがすごい増えてるね

331:名称未設定
07/09/20 23:33:41 Xhf7l+HF0
>>330


332:名称未設定
07/09/21 00:21:45 Qi2gwohZ0
>>326

NSArrayControllerのsortDescriptorsを設定してあれば、自動的にソートされます。

あと、NSValueTransformerの登録はNib fileのロード前にする必要がありますから
Value Transformer Programming Guide Registering a Value Transformerでは
application’s delegateでinitialize: class messageで行うことが推奨されています。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
ではタイミングが遅いように思います。
問題なく動いているようなので、結果オーライかもしれませんが。



333:320
07/09/21 08:33:51 lSzwq6kK0
>>328
ははあ。なるほど。ありがとうございます。

>>332
IBからinspectorで、NSArrayControllerのsortDescriptorsを選ぶんですよね。
ここで、Model Key Pathにnameを設定して、
Validates Immediatelyにチェックを入れるんでいいのでしょうか。

そうすると、

[Session started at 2007-09-20 13:22:40 -1000.]
2007-09-20 13:22:42.993 Hoge[2611] An uncaught exception was raised
2007-09-20 13:22:43.002 Hoge[2611] [<Hoge_AppDelegate 0x38eda0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.
2007-09-20 13:22:43.009 Hoge[2611] *** Uncaught exception: <NSUnknownKeyException> [<Hoge_AppDelegate 0x38eda0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.

Hoge はシグナル 5(SIGTRAP)により終了しました。

となります。これって、"name"というkeyが存在しないって意味だと思うんですが、
どうやったら"name"を見つけてくれるんでしょうか。

334:320
07/09/21 08:38:01 bDIzEEDW0
また、Hoge_AppDelegate.mの中で、
+ (void)initialize {
MyValueTransformer* transformer = [[[MyValueTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"MyValueTransformer"];
}
というのを実装すればいいってことですか?
initializeが1度しか呼ばれない関数なのか理解していないんですが、
static BOOL initialized = NO;
とか用意して、
if(initialized){
MyValueTransformer* transformer = [[[MyValueTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"MyValueTransformer"];
initialized = YES;
}
とするべきですか?

長々とすみません。

335:名称未設定
07/09/21 12:09:17 T5koP5+L0
>>334
URLリンク(developer.apple.com)
の「クラスオブジェクトの初期化」のところを見ると、

クラスは自身が使用される前に、ランタイム環境を準備する機会を与えられます。
initialize は継承されるため、サブクラスのために何度も呼び出される可能性があります。

とのこと。

336:名称未設定
07/09/21 21:44:20 sPcrBli00
NSView(のサブクラス)にテキスト(日本語)を描画したいのですが、
どうすれば良いでしょうか?
(日本語のテキストを持ったNSStringインスタンスの内容を描画することを想定)
ネット上もあるドキュメント、サンプルコードなどご教示いただければありがたいです。

337:名称未設定
07/09/21 22:05:02 tcpbBsLq0
教えようと思ったけどメル欄がうざいからやめた

338:名称未設定
07/09/21 22:12:28 sPcrBli00
>>337
お騒がせしました。
自己解決しました。

hmdtに置いてありました。

339:332
07/09/21 22:35:44 Qi2gwohZ0
>>333

>NSArrayControllerのsortDescriptorsを設定してあれば、自動的にソートされます。
と書きましたが、これではダメでした。
Core Recipes Appを参考にして作ったiTunesもどきのメモソフトで自動的にソート
ができていたので、そう書いたのですが、簡単な検証プロジェクトを作って実験したところ
ソートされませんでした。
自作のメモソフトでなぜうまくいっているのか検討してみます。
しかし違いといえば、contentSetにバインドしているくらいで、ほとんどコードを書いていない
部分なので、困惑しています。

>ここで、Model Key Pathにnameを設定して、
NSSortDescriptorを要素に持つNSArrayを指定します。

initializeについては、ヒレガス本P138で
+ (void)initialize
{
//自身はPersonクラスか?
if (self == [Person class]){
[self setVersion:2];
}
}

例が載っています。
2nd Editionでは索引や、他の章で引用されているのに、この項が載っていません。



340:名称未設定
07/09/22 01:50:16 x63UH/2b0
>>339
どこかで「自動的にソートされる」ってのを見てやってみてだめだったので、
いろいろ試した結果が >>328 なんですよ。

もし、バインドだけでいけるなら私も知りたいです。

341:320
07/09/22 08:53:57 Npi1C4cP0
>>328
書いて頂いたコードを写させて頂きました。ありがとうございます。
ただ、新規項目を追加するとそいつはカラムの最下部に表示されてしまいます。

IBから常にソートできそうな気もするんですが。

>>335
参考にさせて頂き、↓のように変更しました。
+ (void)initialize
{
static BOOL initialized = NO;
if(initialized){
return;
} // if

initialized = YES;
WordColorTransformer* transformer = [[[WordColorTransformer alloc] init] autorelease];
[NSValueTransformer setValueTransformer:transformer forName:@"WordColorTransformer"];
}

342:名称未設定
07/09/22 09:31:10 Jwo4xXMJ0
削除したのに残るplistは「板データを修復」で消えるんだけど。

343:名称未設定
07/09/22 09:32:02 Jwo4xXMJ0
ごめん誤爆

344:名称未設定
07/09/22 18:08:59 e0U06nBz0
アレイコントラーのインスペクタにそれらしいチェックがあったような。
つーかインサートするたびにソートしたらうざくね?

345:名称未設定
07/09/22 21:52:36 YtaGMbG00
HMDTでiPhone開発の話をしてるけど
touch用の開発環境って出てきてるのかな?
iPhone用のアプリはtouchでは動かないみたいだけど

346:名称未設定
07/09/22 22:04:54 V8IHJ6+c0
もうiPod touchがてにはいるようになったの?

347:名称未設定
07/09/22 22:59:32 YtaGMbG00
今日出荷案内が来たよ

348:名称未設定
07/09/23 11:15:15 74QYrWGQ0
Core Data アプリで、data を NSArrayController のバインディングで
テーブルビューに表示させているのですが、IB で NSArrayController に
設定した predicate が働いてくれません。

hoge という属性を持つ Core Data のエンティティがあり、
NSArrayController の IB の Inspector の Attributes で
hoge != "hogehoge" として Set Predicate したのですが、
テーブルビューの中に hoge == "hogehoge" のデータも含め
全データが表示されてしまいます。

ちなみに、hoge == "orz" などいい加減な predicate を設定しても
動作は変わらず、すべてのデータが表示されます。

バインディングの設定の方は、何度も確かめたので正しいと思います。

どこで使い方を間違えているでしょうか。

349:名称未設定
07/09/23 15:30:27 zABjWK1w0
たぶん根本的に間違ってるよ。
そこに条件式を書いただけでは動かない。

350:348
07/09/23 16:27:42 74QYrWGQ0
>>349
下記ページの一番下の図にある通りのやり方なのですが、
根本的に間違っているのはどの辺でしょうか。
URLリンク(journal.mycom.co.jp)

条件式以外には何が必要ですか?
お教え願います。

351:名称未設定
07/09/23 19:40:13 shGaGM9l0
>>350

== ではなくて、likeとかcontains[cd]を使いましょう



352:351
07/09/24 20:34:56 s/hLGoL70
>>350

Set Predicate ボタンはちゃんとクリックしているのでしょうね?



353:348
07/09/24 20:58:16 o5Y8mmRh0
>>352
クリックしています。わかりにくい書き方でしたが、>>348
「Set Predicate した」というのはボタンを押したという意味です。

>>351 で predicate の書式についてお教えいただきましたが、
== を使わない方が良い理由は何でしょうか?

== と書いた predicate を NSArrayController にバインディングで
設定した場合にはきちんと動作しており、書式は問題ないと思うのですが。

>>349 は別の方でしょうか?「根本的な間違い」というのが何なのか、
まったくわからないままなのですが‥。

354:351
07/09/24 22:12:01 s/hLGoL70
>>353
>== を使わない方が良い理由は何でしょうか?

こちらの勘違いでした。
Predicate Programming Guideの例で
>Simple comparisons, such as grade == 7 or firstName like 'Mark'
というのがあがっていて、文字列の比較には==が使えないと思い込んでいました。
昨日試したら==でもOKでした。

predicateの設定なんて、predicateを書いてボタンをクリックするだけで他にすることはないはずです。

例えば、NSTreeControllerで parent == nilと設定すれば、第一階層のアイテムだけが
表示されます。

お役に立てず、すいません。

355:名称未設定
07/09/24 22:45:14 s/hLGoL70
ここ数日のうちにCocoabuilderやCocoa Bindings Examples and Hintsで
NSIndexSetのメソッドcountOfIndexesInRange:
を使ったコードが出ていますが、Tigerにはこんなメソッドはありません。

Leopardで導入されるものでしょうか?
NSTableViewのdrag & dropのコードで、似たようなメソッドを作ったものですから、
Appleが正式にサポートするとうれしいです。

Leopardの発売が更に楽しみになりました。

356:名称未設定
07/09/25 20:42:20 DPSBhINH0
ついでに、WebObjects を、Objective-C にしてほしいよなーー

357:名称未設定
07/09/26 07:47:06 KqKT5P0s0
WOはもうディスコンまっしぐらじゃない?
あれ?オープンソースになったんだっけ?

358:名称未設定
07/09/26 14:05:35 cVuwNs9i0
Quartz 2D Extream もどうなったのやら。やっぱディスコンまっしぐらかなぁ。

359:名称未設定
07/09/26 18:52:49 //OJRjK+0
QuartzGLになりました。

360:名称未設定
07/09/26 22:58:38 KOSgLSOH0
質問です。

大量のボタンに対して、同時に同じメッセージを投げたいんですが、
1つのアウトレットは1つのオブジェクトしか指定できません。
大量のボタンの数だけアウトレットを用意するのもスマートではないと
思いますが、何か良い方法ありますか?
よろしくお願いします。




361:名称未設定
07/09/26 23:16:06 GjSqGsk10
>>360
必要なだけNSArrayに入れてmakeObjectsPerformSelectorとか、後はNSNotificationとかかな。

362:名称未設定
07/09/27 00:01:26 PDbAKstz0
NSViewでまとめてsubViewsで取り出す

363:名称未設定
07/09/27 00:43:29 8K+2oe1e0
過去に同じようにな質問なかったか

364:名称未設定
07/09/27 00:47:46 jyqt4+rC0
>>359
thx.

365:名称未設定
07/09/27 04:55:55 1zrfBisP0
空白またはタブで項目が区切られているレコードからトークン
を切り出すのに、 chSetを whitespaceAndNewlineCharacterSet として

aScanner = [NSScanner scannerWithString:parsedString];
while(![aScannerisAtEnd]){
if([aScanner scanUpToCharactersFromSet:chSet intoString:&token])
NSLog(token);
[scanner scanCharactersFromSet:chSet intoString:nil];   }

としていますが、
アスキー文字だと期待通りに動くのですが、レコード中のどれか一つの項目を
日本語にするとその部分がスキップされて(空白だと思われて)しまいます。

どうしたらいいでしょうか。OSは10.3.9です。

366:名称未設定
07/09/27 05:24:39 CM0/B6Sl0
>>365
NSLog(token); → NSLog(@"%@¥n", token);
でどうかな?

367:名称未設定
07/09/27 06:07:29 1zrfBisP0
NSLog(@"%@¥n", token);  にすると、
日本語フィールドも表示されるようになりました。
が、最後に余計な「A¥n」が出ます。(本当はAの上に変な記号のついた文字。これをいれると
Cocomonarが落ちるので書けない
)よくわからないのですが、エスケープされてる、
ということなのでしょうか。

NSLog(@"%@", token); にするといままで通りです。
が、
NSLog(@"%@ ", token); と、後ろに空白文字を置くとキチンと
表示されます。

文字コードが悪さをしているのは見当つくのですが、具体的にどこが
悪いのかはさっぱりです。ファイルを読み込むときも、NSDataに落としてから
エンコーディングを変えながらいろいろ試してみたのですが。


368:名称未設定
07/09/27 06:23:48 CM0/B6Sl0
>>367
ごめん、¥はバックスラッシュのつもりだった。
とにかくNSLogの日本語表示だけの問題だから気にしなくていいよ。

369:名称未設定
07/09/27 11:57:33 1zrfBisP0
本当だ、¥の代わりにバックスラッシュにしたら期待道通りの結果がでました。
ありがとうございました!!

370:名称未設定
07/09/27 14:30:21 8h5IL6rA0
巨大なテキストファイルから改行コードで区切って1行ずつ読み込んで処理したいのですが、
テキストファイルをすべて読み込んでから改行コードで区切って配列に入れるとメモリを膨大に消費してしまいます。

perlっぽくファイルハンドルを取得してwhile文でeofまで回すような
ストリーミングっぽく処理したいのですがどうすればよいのでしょうか?



371:名称未設定
07/09/27 15:02:54 DoK9wEPc0
一番簡単なのはCのfgets()を使う方法。改行がLFでないと使えないけどな。

後は先読みバッファを作って、特定のサイズ分ファイルを読み込んで、そこから
改行までを取り出して、残った部分をムーブして空いた分だけファイルから
読み込み、これを繰り返す。

372:名称未設定
07/09/27 16:12:29 8h5IL6rA0
>>371
ご教授ありがとうございます。
Cのfgets()関数を使ってうまくいきました。
objective-cで出来るか探してみましたがなさそうですね。



373:名称未設定
07/09/29 10:12:39 zZqJ0dcb0
NSWindow 上に NSTableView がいくつか置いてあるのですが、
その TableView 間でファーストレスポンダが変わったことを
検出するには、どういった方法があるでしょうか。


374:名称未設定
07/09/29 15:34:01 8IGuMuZ60
文字列を正規表現で置換したいのですが、標準機能ではないのでしょうか?

>>373
テーブルビューの選択が変わったなら通知するのがあったような。

375:名称未設定
07/09/29 15:40:36 x13OGOM+0
Cocoaで正規表現ならOgreKitが定番かな。

URLリンク(www8.ocn.ne.jp)

376:名称未設定
07/09/29 15:45:51 pwcm/+Ub0
>>373
acceptsFirstResponderとかその辺でどうかな。

377:名称未設定
07/09/29 15:57:41 E1JHDeBB0
regex.h

378:373
07/09/29 16:17:02 zZqJ0dcb0
>>374
どのような通知でしょうか。
調べてみてはいるのですが、見つかりません。

>>376
すみません、acceptsFirstResponder をどのように使うのでしょうか。


379:名称未設定
07/09/29 16:27:27 pwcm/+Ub0
>>378
ググってみて。HMDTさんのサイトがお勧め。

380:名称未設定
07/09/29 18:34:35 EN0/o6QM0
通知ってnotificationのことでしょ
NSTableViewのヘルプにあるよ

381:373
07/09/29 22:19:34 zZqJ0dcb0
>>380
具体的にどの notification のことをおっしゃられていますでしょうか。
検出したいのはTableView間の移行の話なので、TableView の notification
ではないのではないかと思うのですが。

ちなみに現在は暫定策として、NSWindowDidUpdateNotification を
使っていますが、これだと必要のないときにも notification が出るので、
パフォーマンス改善のためにもっと良い方法を探しています。

382:名称未設定
07/09/29 22:57:21 3B7qOXdqP
NSResponderで定義されてるbecome~などのファーストレスポンダ関連の適当なメソッドを上書きして適当な通知を送るようにすればいいんじゃない?

383:380
07/09/29 22:59:45 EP9ETOnN0
>>373
ごめんね、NSResponderのnotificationだったわ

384:名称未設定
07/09/30 08:23:16 1+3bPOa/0
>>361
遅レス申し訳ありません。

InterfaceBuilderで置いたボタンをNSArrayに入れる方法が分かりません。
すみませんが、よろしくお願いします。

385:名称未設定
07/09/30 11:59:03 f54IiRS90
>>384
そのボタン群用にNSButtonのサブクラスを用意して、
awakeFromNibで適当なNSArrayに格納するとかかな。
NSNotiricationを使う場合も同様に。

任意のタイミングで格納する場合は、subviewsを使うしかないと思います。

386:名称未設定
07/09/30 16:30:45 KRhNhdGX0
プログラム最後の
[pool release]; で実行エラーが発生します。

allocとreleaseの数は合わせてあるのですが、メモリ管理でほかに
注意すべき点はなんでしょか。

387:名称未設定
07/09/30 16:33:17 2MyNhREa0
その直前でretain count調べてみれば?

388:名称未設定
07/09/30 16:36:42 ZGxp/2ZH0
エスパーがいらっしゃるまでしばらくお待ちください

389:名称未設定
07/09/30 16:46:22 FHx4HOJm0
retain count なんて調べてるやつはバカです

390:名称未設定
07/09/30 18:25:25 9ybOP3SL0
alloc+copy==release+autorelease

391:名称未設定
07/09/30 18:37:41 1+3bPOa/0
>>385
やってみます。
ありがとうございました。

392:名称未設定
07/09/30 18:50:03 hHTRsSyH0
LeopardでRIUIを採用するのかしないのか
QuartzGLも採用するのかしないのか
雰囲気的にはTigerが出る前と全く変わらないな...

393:名称未設定
07/09/30 18:54:51 hHTRsSyH0
誤爆に見えないかもしれないけど誤爆したみたい...orz

394:名称未設定
07/09/30 20:53:05 KRhNhdGX0
>>390
copy は明示的には使っていないので、数は合っている筈なのですが、
もう少し勉強してみます。

395:名称未設定
07/09/30 20:59:28 RmZQ6wEv0
クラスメソッドの中で一時的に作成した配列や辞書は、
メソッドの最後でまめにリリースしたほうが良いのでしょうか?
それとも勝手にリリースしてくれるのでしょうか?

アプリケーションの使用メモリが増えてきてどうすれば良いのかご教授下さい。

396:名称未設定
07/09/30 21:19:06 J3lW9Bur0
どう作成したかによる。そのルールはクラスメソッドかどうかは関係ない

NSArray* array = [[NSArray alloc] initなんたら]
で作成したのならスコープを抜けるまでに
[array release] または [array auto] する義務がある

NSArray* array = [NSArray arrayWithなんたら]
で作成したのなら
[array release] または [array auto] してはいけない

NSArray* array = [NSArray arrayWithなんたら]
で作成した場合でも、その後
[array retain]
したのなら
[array release] または [array auto] する義務がある


397:名称未設定
07/09/30 21:24:04 J3lW9Bur0
auto の部分は autorelease の誤りです

398:名称未設定
07/09/30 21:38:11 KRhNhdGX0
copyを使ってなければ、allocの数とrelease 又はautoreleaseの
数を一致させればいいのですよね。
でもpool releaseでコケる。う~む。

399:名称未設定
07/09/30 21:44:01 J3lW9Bur0
暇なんで >>396-397 にさらに解説しておくと


alloc と initなんたら によるインスタンス作成は、インスタンスの所有が呼び出し側に発生する。
つまり(releaseまたはautoreleaseで)所有を放棄する義務があり、またそうしないといつまでもメモリ解放されない。

arrayWith なんたら によるインスタンス作成は、インスタンスの所有は呼び出し側にない。
よってreleaseまたはautoreleaseしてしまうと、他の所有を勝手に放棄してしまうことになり、過解放となる
(クラッシュなどを引き起こす)。

releaseとautoreleaseの違いは、
releaseは、呼ぶとすぐに自分の所有を破棄する。他も所有していなければメモリ解放される。
autoreleaseは、後で(ランタイムが適当なタイミングで)所有が破棄される。
大まかに言うと、メソッドがreturnしたらreleaseが呼ばれる(この場合がほとんど)。

つまり、arrayWith なんたら によるインスタンス作成は、
alloc と initなんたら によるインスタンス作成 に加え、autoreleaseが既に一度呼ばれた上で渡されている
というだけの違い。

所有のないインスタンスに自分の所有を加えるには、retainを呼ぶ。これにより所有が呼び出し側に発生し、
いずれ所有を放棄しなくてはいけない義務が発生する。

400:名称未設定
07/09/30 23:13:19 J3lW9Bur0
とりあえずretainCountの仕組みを

・そのpool releaseをコメントアウトするとコケなくなるのか?

401:名称未設定
07/09/30 23:14:22 /8gv9Izg0
>>399
GCが導入されると、違いは無くなるのですかね?。

402:名称未設定
07/09/30 23:14:34 J3lW9Bur0
>>400は無視して下さい

>>399で述べたような、autoreleaseによるreleaseの予約を管理しているのがNSAutoreleasePool。
以下の場合、arrayは[pool release]が呼ばれたタイミングでreleaseされる。

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSArray* array = [[NSArray alloc] init];
[array autorelease];
[pool release];

通常、何らかのインスタンス(上の例だとarray)にautoreleaseを呼ぶと、
一番最後に作成されたNSAutoreleasePoolのインスタンス(上の例だとpool)に、
その何らかのインスタンス(上の例だとarray)が登録される。そのNSAutoreleasePoolのインスタンス(上の例だとpool)
が破棄された時に、登録された何らかのインスタンス(上の例だとarray)にreleaseが呼ばれる。

Cocoaアプリのメインスレッドでは、NSApplicationがNSAutoreleasePoolの作成と破棄を繰り返している。
なので通常、自分でNSAutoreleasePoolのインスタンスを作成しなくてもautoreleaseの呼び出しが可能。

サブスレッドでは、NSAutoreleasePoolのインスタンスを自分で作成する必要がある。
また、メインスレッドでも、forやwhile文などのループ内でautoreleaseを何度も呼び出す場合は、
release予約の(つまりメモリ解放されない)インスタンスが増えるので、ループ内で
NSAutoreleasePoolの作成と破棄を繰り返して使用メモリの増大を防ぐという方法がある。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch