Cocoaはさっぱり!!! version.8at MAC
Cocoaはさっぱり!!! version.8 - 暇つぶし2ch1:名称未設定
07/05/18 23:24:52 ZBDhxXyy0
初心者は教えてくれる方への感謝を忘れずに。
上級者も初心者だった頃の気持ちを忘れずに。

前スレ
Cocoaはさっぱり!!! version.7
スレリンク(mac板)

2:名称未設定
07/05/18 23:29:22 UJP3ocn+0
乙かれーしょん

3:名称未設定
07/05/19 00:43:34 sciB+uL40
1000 名前: 名称未設定 Mail: sage 投稿日: 2007/05/19(土) 00:29:23 ID: uGrJMnws0
[self release];

4:名称未設定
07/05/19 08:47:22 VgPVILTS0
カーボンが4げっt

5:名称未設定
07/05/19 10:43:00 ndYGZwPE0
前スレ1000の秀逸さに感動した俺は新参?

6:名称未設定
07/05/19 11:43:25 uJS6/6lK0
[self release]; というのはあまり使わないような気がする。

7:名称未設定
07/05/19 11:57:48 K8wpdP1P0
-init内で何かミスったときとか。

8:名称未設定
07/05/19 13:47:34 6RJB6in20
じゃ次は [super dealloc] で。

9:名称未設定
07/05/19 15:01:23 7fei3xwy0
autorelease されて持ち主のいないウインドウは勝手に閉じてしまうので、自分を
retainして、閉ボタンが押されたときに [self release]; するのは邪道ですか

10:名称未設定
07/05/19 20:37:55 jAL67W1S0
ShiftJIS のCSVを開いて、パースするプログラムを書いているのですが、日本語が含まれているとうまく処理できません。日本語が含まれているセルの結果が、文字コードで表示されてしまいます。
1行切り出した段階のparsedStringをNSLogで表示させるとうまく日本語が表示されますが、その後の、columnArrayではうまく表示できません。
何が悪いのか、まったく見当がつきません。どなたか、教えてください。

11:名称未設定
07/05/19 20:38:45 jAL67W1S0
上の続きです

//Open the file
NSData *data = [[NSData alloc] initWithContentsOfFile:file];
managedCSV = [[NSString alloc] initWithData:data encoding:NSShiftJISStringEncoding];

//managedCSV = [[NSString alloc] initWithContentsOfFile:file];

rowArray = [[NSMutableArray alloc] init]; //Initialize rowArray

NSString* parsedString;
NSRange range, subrange;
int length;

length = [managedCSV length];
range = NSMakeRange(0,length);

while (range.length > 0) {
//1行切り出す
subrange = [managedCSV lineRangeForRange:NSMakeRange(range.location,0)];
parsedString = [managedCSV substringWithRange:subrange];

range.location = NSMaxRange(subrange);
range.length -= subrange.length;

NSLog(parsedString); //ここではうまくいく


12:名称未設定
07/05/19 20:42:04 jAL67W1S0
ほんと長くてすみませんorz


//カンマで区切って、Arrayへ
NSArray *columnArray = [parsedString componentsSeparatedByString:@","];
NSLog([columnArray description]); //ここの結果がおかしい

[rowArray addObject:columnArray];
}

長文ですみません。。。

13:名称未設定
07/05/19 21:19:06 7fei3xwy0
NSArray の description はプロパティリスト形式でエンコードされたものを返すから。
columnArrayの中には正しい値で格納されているはず。


14:名称未設定
07/05/19 23:06:23 KTFjrMhL0
要は、NSLog(@"%@", columnArray);
にしとけと、そういう事です。

15:名称未設定
07/05/20 01:06:30 95dk2TSg0
>>14
>要は、NSLog(@"%@", columnArray);
え、それって結局 [columnArray description] なんじゃなかったっけ?

ところで >>11 のコードだけど、
NSLog() に直接文字列を渡すのはあんまりよくないかな。些細なことだが。

16:名称未設定
07/05/20 03:58:14 Q4ZcZ5bJ0
文字列にメタキャラがあったら不味いわな。

17:名称未設定
07/05/20 08:12:37 Wl6kGVzP0
ありがとうございます。
>>13
中身に正しく格納されているのを確かめるには、どうすればいいのでしょうか。
NSLog(@"%@" , [columnArray objectAtIndex:2]);
などとして、日本語が含まれるであろうところを表示させても、何も表示されません。
>>14
%@で指定すると、そのオブジェクトのdescriptionが呼び出されるはずなので、同じ結果ですが。
>>15
NSLog()に直接文字列を渡すのはよくないってのは、どういうことですか?
NSLog([parsedString description]);
とすべきということでしょうか。
>>16
文字列にメタキャラがあるとは、どういうことでしょうか?
メタキャラと言われても、正規表現で使う記号のことしか思い浮かばないのですが。

18:名称未設定
07/05/20 08:45:26 VLuBbFIP0
NSLogや-descriptionはローカライズされた文字表示には使えない。
エンコーディングが指定出来ないから。
日本語文字を表示したいのなら、自前でNSLog(@"%@",hoge)に相当
するメソッドを作る。

メタキャラの話は、format string vulnerabilityでググれ。いわゆる鉄則。

19:名称未設定
07/05/20 10:42:46 g8ihdvQq0
writeToFile でファイルに書き出して、Property List Editor で開いてみるとか

20:名称未設定
07/05/20 12:11:09 S8wwiPq80
NSPopUpButton を使ったユーザーインターフェイスで、
選択する項目が1つしかないときは NSPopUpButton ではなく
同じ位置に NSTextField でその項目を表示したいのですが、
状態に応じて NSPopUpButton と NSTextField を入れ替える、
というようなことが、IB 上、あるいはコードから可能でしょうか。

見た目だけなら、それぞれの setHidden を入れ替えればできることはできますが、
IB 上で同じ位置に NSPopUpButton と NSTextField を置かなければならず
編集等がやりにくいので、NSPopUpButton と NSTextField とを入れ替える、
ということがしたいです。


21:名称未設定
07/05/20 12:31:47 ZfxNfI7k0
それUI設計を考え直したほうが良いんじゃ。

22:名称未設定
07/05/20 12:44:40 G1nQj3380
NSComboBoxじゃ駄目なの?


23:名称未設定
07/05/20 14:30:35 EIWpzyux0
>>17
NSArray *columnArray = [@"%@,%s" componentsSeparatedByString: @","];
NSLog(columnArray);
でいいことがあるよ!
NSLog(@"%@", [columnArray componentsJoinedByString: @" "]);

>>20
NSComboBoxが本命、またはaddSubview:/removeFromSuperviewと思うけど、IBでの編集が目的なら
NSTabViewに入れればいいんじゃね?

24:20
07/05/20 15:07:36 S8wwiPq80
>>22 >>23
NSComboBox は今まで使ったことがありませんでした。
ありがとうございます。調べてみます。

NSPopUpButton の selectedObject のバインディングを使ってるのですが
NSComboBox でも同じことはできるでしょうか。NSComboBox の
Bindings のところには、content、contentValues、value しかありませんが‥

NSTabView は迷ったのですが、NSPopUpButton と NSTextField とを
入れ替えたいものとそうでないものとが UI のレイアウト上散在しているので、
今回の場合ちょっと使いにくいかなと思いました。


25:名称未設定
07/05/20 15:29:52 g8ihdvQq0
やろうとしていることがよくわからないんだけど
選択する項目が一つしかないときに表示するNSTextFieldは編集できなくていいの?
項目が一つのときはポップアップのUIがうざいからシンプルなNSTextFieldにしたい、ということ?
それならボーダレスにすればシンプルな表示になるけど。

26:20
07/05/20 17:40:05 S8wwiPq80
>>25
すみません、わかりにくい書き方でした。

あるウインドウ上でデータの編集をするのですが、特定のデータを
削除したいときにも、一旦その編集ウインドウを開いて、
ユーザーがデータの内容を確認してから削除する、ということを
やろうとしています。

編集モードのときには、選択肢のあるデータは NSPopUpButton 風に表示し
(ユーザーが選択可能)、削除モードのときには、選択されているデータを
NSTextField 風に表示する(表示のみ、選択、編集は不可)という
インターフェイスにしようとしています。


27:名称未設定
07/05/20 17:50:19 SHOl/NGE0
NSPopUpButton 1つにして
-(void)setBordered:(BOOL)flag;
-(void)setBezelStyle:(NSBezelStyle)bezelStyle;
-(void)setEnabled:(BOOL)flag;
を組み合わせればいいんでないか?

28:名称未設定
07/05/20 21:06:22 Wl6kGVzP0
>>18 >>19
ありがとうございます。

format string vulnerability ってはじめて聞きました。
プログラミングの初心者がよく陥るミスなのですね・・・。

理由はよく分かりませんが、とりあえず、NSLog("STRING %@" , [columnArray objectAtIndex:2]);
とすると、日本語が含まれている文字列が表示できました。

>>23
どういうことでしょうか。
エラーになって、落ちてしまうのですが・・・。

29:名称未設定
07/05/20 22:15:06 EIWpzyux0
>>28
>>23の上2行
>>17,28
>文字列にメタキャラがある
NSLog(columnArray); NSLog([parsedString description]);では「%@,%s」が入力ファイル中に
あったらまずいという話。

30:名称未設定
07/05/21 07:41:23 7LGNLKMD0
>>29
なるほど。
メタキャラがあるとエラーで落ちてしまう例だったのですね。

31:名称未設定
07/05/21 23:12:19 TdM0ZjG7O
落ちるだけならいいんだけどね。vulnerabilityなんで悪用されるかも。

32:名称未設定
07/05/29 09:39:57 Z+NxGNZg0
Cocoaスクリプタブルなアプリケーション、モダンな
書き方のサンプルコードってどのあたりを見たらよいでしょうか。

FireWireSDKのVirtualDVHSのソースを見て驚いたのですが、
アプリの主要クラスがAppleScriptのハンドラだけになっていて、
いきなり[self delegate]に丸投げされているとか、ちょっと思い
つかなかった作り方になっています。これって効率的なんですかね?

ただ、やっぱりscriptSuite+Terminologyの古いやり方でした。
10.3.xを切り捨てるとすると、新しい記述方法が使えると思うの
ですが、お勧めなサンプルコードがあれば教えてください。


33:名称未設定
07/05/29 21:18:28 a00qDN0E0
Pasteboard に適切でないもの
[pb setData:@"string" forType:... ];
とかを書き込むと、全てのプロセスが停止に至ってしまうのはウチ(10.4.9)だけ?

34:名称未設定
07/05/30 13:27:49 M44/L4u50
自分で作成したクラス(AppControllerとか)で、NSArrayContorollerでの選択されているオブジェクトの変更を受け取るには、どうすればいいのでしょうか。
つまり、自分で作成したクラスに、NSArrayControllerから選択されているオブジェクトの変更があるたびに、アクションを送信してもらうには、どうしたらいいのでしょうか。

35:名称未設定
07/05/30 16:09:06 E2XSp/Pe0
>>34
NSKeyValueObservingでNSArrayContorollerのselectionを監視。
もしくはNSTableViewのnotificatioかdelegate経由。
もしくはNSNotificationで自分の好きなように。

36:名称未設定
07/05/31 15:44:40 OPvQwZSL0
>>32

10.5のScript Bridgeの事?

37:名称未設定
07/05/31 17:55:14 o/25uG0z0
>>36
いえ、sdefの話です。調べていたらそのものズバリの回答がありました。

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

「aete をアプリケーションに追加する

・・・(また、用語説明を利用するのにアプリケーションも起動する必要が
あるため、スクリプト作成者は面倒に思います)。

したがって、アプリケーションの一部として同じような aete 用語説明を作成
するべきです。これを行う最も簡単な方法は、sdef を使用して用語説明を作
成し、それから sdp(1) を使用して 3 つのファイル(.scriptSuite、
scriptTerminology、および aete.r)をすべて生成することです。」

このいきなり起動するっていう事象、悩んでいたんですけど、ちゃんと
ドキュメントが有ったんですね。

38:名称未設定
07/05/31 21:25:46 zK9AEhFO0
>>35
NSKeyValueObservingで、実装することにしました。
ありがとうございます。

39:名称未設定
07/06/02 14:18:31 sT94ODrc0
Drawerって親ウィンドウのサイズに依存しますよね。
横に細長なウィンドウだと、Drawer付けられないんですが
なんかいい方法ない?

40:名称未設定
07/06/02 14:58:26 PljomMdh0
下に出す。

41:名称未設定
07/06/03 13:05:44 mna10Y1g0
えくすきゅーずみー!
CoreDataで作ったEntityを途中で変更したとき、永続化させているデータの構造を
変更する手段って用意されているのでしょうか?
よいじかんをー!

42:名称未設定
07/06/03 14:39:27 b0tdP23k0
Core Data FAQ ヨリ
Mapping data from one schema to another is a difficult problem to solve, and Core Data does not provide a generic solution―you must perform the transformation yourself.

43:名称未設定
07/06/03 15:11:20 mna10Y1g0
>>42さん ありがとう
まいせるふで解決するよー

44:名称未設定
07/06/07 04:12:52 TxansO1r0
QTMovieViewでDRM付きのm4vが再生できないのは
当然なんですか?

45:名称未設定
07/06/07 19:16:07 iiSZh04z0
あれ、できなかったっけ。

46:名称未設定
07/06/08 11:19:17 rvM2Yx/u0
やってみたけど、DRM 付きの m4p は聞けた。
m4v は持ってないので確認できない。


47:名称未設定
07/06/08 20:19:35 rlaJ3J8O0
10.3.9で試してみたけど、再生できなかった。
m4pならできたけど。

48:名称未設定
07/06/10 18:26:33 hI0cu8D+0
NSOutlineViewとNSTableViewの垂直スクロールが同期した
プログラムを書こうと思っています。
NSTableViewへの値の設定は[treeTableView setBoundOrigin:pos];
で出来ることがわかったのですが、NSOutlineViewからの垂直
スクロール値の読み出し方法がわかりません。
ご存じの方、ご教授ください。


49:名称未設定
07/06/10 18:29:08 xqak4VE+0
fffff

50:名称未設定
07/06/10 20:09:47 s3V0Kn6M0
NSOutlineViewってNSTableViewのサブクラスじゃなかったっけ?

51:名称未設定
07/06/10 20:10:05 tHbw2xow0
NSScroller の floatValue かな
値設定は setFloatValue:knobProportion: で。

52:48
07/06/11 09:37:46 1ykIS/Rk0
ダメです。InterfaceBuilderでNSScrollViewは関連づけできますが、
NSScrollerは関連づけができません。


53:名称未設定
07/06/11 09:56:44 9X1rbhME0
xxx.h
.
.
IBOutlet NSScrollView* scrollView;// IBで関連づける
NSScroller* hScroller; // 初期化メソッドで値を設定する

初期化メソッドかsetScrollViewで
xxx.m
.
.
hScroller = [scrollView horizontalScroller];
}
ってやるのはどうですか


54:名称未設定
07/06/11 09:57:09 T3nP0R6O0
InterfaceBuilder 使わなけりゃいいだろ。

55:名称未設定
07/06/11 10:04:04 T3nP0R6O0
NSTableView と NSOutlineView の垂直スクロールを同期させるというのが良く分からん。
表示中の行の数が同じでなければ setFloatValue: を使っても同期にならないだろうが、
NSOutlineView を使ってるということは折り畳まれた行が存在することが考えられるから
表示中の行の数が同じとも限らんし。

56:48
07/06/11 17:24:05 1ykIS/Rk0
>>51
'NSScroller'may not respond to '-floatValue:'でした。


57:名称未設定
07/06/11 17:32:32 mbR9EhtI0
(1) floatValue: ではなくて floatValue になっている?
(2) 警告出ても無視していいから、それで動いたの?


58:48
07/06/11 20:10:36 1ykIS/Rk0
(1)はい
(2)警告を無視したら56番のメッセージが表示されて作動しません


59:名称未設定
07/06/11 20:21:35 mbR9EhtI0
コードがどこかおかしいはず。
これで普通に動いたよ。

-(void)syncScroller
{
NSScroller* scroller1 = [scrollView1 verticalScroller] ;
NSScroller* scroller2 = [scrollView2 verticalScroller] ;
[scroller2 setFloatValue:[scroller1 floatValue]];
}



60:48
07/06/12 00:36:50 TYIgO7qC0
ありがとうございます。無事動きました。
しかし、これでは使い物にならないですね~


61:名称未設定
07/06/12 01:12:00 luus+mNL0
具体的に何をしたいのか分からんから
使い物にならないと言われても
そーですかとしか言いようが無い

まあ、標準の部品で実現できそうにないことなら
その表現方法が本当に正しいのかを疑ってみるべきかもしれない

62:名称未設定
07/06/12 05:03:25 LE6VV2Gm0
自分の望んでいたことが無事にできたのに、使い物にならないっておかしくないか

63:名称未設定
07/06/12 09:39:58 iZm9RHNQ0
他人が親切に教えてやってるのに、使い物にならない、の一言で切り捨てる
48は以後スルーでよし。

64:名称未設定
07/06/12 11:44:23 9fyh4C1c0
safari for windowsでmkinoさん涙目?

65:名称未設定
07/06/12 16:22:42 w6MMEnQe0
HMDT赤本を買ってきてCocoaとかCoreDataの勉強を始めました。
CoreData の non-Document タイプのアプリを作ろうと思い、
XcodeのモデルウィンドウからIBのMainMenu.nibのウィンドウに
エンティティをドロップするだけでアプリができ感動しました。

次に別のウィンドウにTableViewを表示したくなったので
MainMenu.nibの他に新しいnibを作り、
そっちのウィンドウにエンティティをドロップしてみたんですが、
データの表示ができません。
MainMenu.nibにはAppDelegateとArrayControllerがありバインディング
していて入力も表示もできましたが、
新しいnibにはAppDelegateがなく、
ArrayControllerとFile'sOwerしかないので
何らかの方法でバインディングする必要があると思います。
とりあえずFile'sOwnerにバインドしたんですが表示されません。

AppDelegateと新しいnibのFile'sOwnerの関係やら
CoreData の部分で ArrayController と接続やら
どーしたらいいのやらさっぱりわかりません。

近いサンプルコードのありかとか、アドバイスをお願いします。

66:名称未設定
07/06/12 17:06:00 drt+veFf0
>>65
まず一回ちゃんと本読めよ...

67:名称未設定
07/06/12 17:07:42 Q66+HK1K0
>>65
URLリンク(tbboy.cocolog-nifty.com)
手前味噌だが。

68:名称未設定
07/06/12 18:26:16 DylgJ4Wp0
>>65
>AppDelegateと新しいnibのFile'sOwnerの関係やら
ヒレガス本読め

69:名称未設定
07/06/12 19:54:42 rm3r2fE/0
CocoaにHTTP のライブラリはありますか?

一体どこにライブラリの説明があるのか良く分からなくて。。。

70:名称未設定
07/06/12 20:31:33 ZolpA+Sn0
>>69
「HTTPのライブラリ」だけだとなんとも..
クライアント側ならNSURLRequest+NSURLConnection/NSURLDownloadで
だいたいできるんじゃないかな。delegateである程度制御できるし。

もっと細かいことがしたい、もしくはサーバ側の実装をするなら
CFHTTPなどのCFNetworkのC API(非Cocoa)だと思うよ。

71:名称未設定
07/06/12 23:36:14 eoZFaP4J0
safari for winはcocoa on win(旧open step)で実装したの?


72:名称未設定
07/06/13 04:42:32 RFkwfKY60
HMDT読め。

73:名称未設定
07/06/13 07:47:43 tx1aMvDC0
65です。
>>66さん
HMDT赤本を読んでみたのですが、別のnibを使うようなサンプルがなく
よくわかってません、すいません。
>>67さん
参考にしてみます。ありがとうございます。
>>68さん
本屋でヒレガス本を探してみます。

ADCのサイトを見てますが探し方が悪いのと英語なので苦労してます。
Cocoaのプログラムを作る時の、nibの持ち方はこうするべき、
リソースはこう持つべき、全体としてこう作るべきとか等の、
定石などがわかるような文献やサイトがあればいいのですが。。。

74:69
07/06/13 08:40:50 jcr/KQtr0
thx>>70

>サーバ側の実装をするなら CFHTTPなどのCFNetworkのC API(非Cocoa)だと思うよ。

CFNetworkをググってみまつ。

75:名称未設定
07/06/13 13:29:46 aXtlj5LE0
>>73
AppDelegateのインスタンスが無いっていうなら,
クラス一覧からAppDelegateをインスタンス化(Instantiate?)すればいいんじゃないの?
Core Dataほとんどやってないから合ってるかわからんけど.

76:66
07/06/13 16:52:12 SjgSRBeA0
>>73
(私もCoreDataは使ってないから分からないけど)ちょっと見た限り、
>>75さんのいうようにオリジナルのAppDelegateを流用すればいけるんじゃないかな。

(試してないけど)手順としては
1・オリジナルの*_AppDelegate.m(h)をコピー。
2・コピーした*.mのapplicationShouldTerminateをawakeFromNibへ変更。
3・コピーした*.m(h)をプロジェクトに追加。
4・コピーした*.hを新しいnibに読み込んでインスタンス化。
あとはオリジナルと同じ手順でできると思う。
ひょっとしたらIBでbindingとoutletの設定が必要かも。

私も(読んだ事ないけど)ヒレガス本を推薦しておきます。

77:名称未設定
07/06/13 17:02:23 tx1aMvDC0
65です。
File'sOwnerをCustomClassをAppDelegateに変更し、AppDelegateで別のNibファイルを
ロードすると、本のサンプルと同じ動作をしました。

目的として複数ウィンドウを表示させTableViewを表示したいので、
AppDelegateから別nibのウィンドウ用のWinControllerのインスタンスを生成し、
別のnibのFile'sOwnerのCustomClassにしたところウィンドウの表示はできました。

しかし、別のnibにあるCoreData用のArrayControllerからFile'sOwnerの
managedObjectContextにBindingして実行すると、Xcodeの実行ログには
this class is not key value coding-compliant for the key managedObjectContext.
と表示されて動作しないのです。

このWindowControllerでロードされた別のnibにおいて
ArrayControllerからmanagedObjectContextにBindingするには
どうしたらできるのかわかりません。
CoreDataとBindingと別のnibで表示の実装で詰ってしまいました。
それともわたしは大きな勘違いをしているのでしょうか。

>>75さん
CoreDataプロジェクト生成時に自動生成されるAppDelegateではなく、
自前でウィンドウ毎にAppDelegateを生成するって事ですよね。
AppDelegateのオブジェクトを管理するコントラーラを作らないといけないのかな。

CocoaやCoreDataって深そうですし難しいです。

78:66
07/06/13 17:05:43 SjgSRBeA0
日本語版は内容が古過ぎるみたいなので、やっぱりヒレガス本推薦取り消します。
そのぐらいなら日本語のサイトでも十分勉強できると思うし。
(実際、私は日本語のサイトの情報だけでやってこれましたよ)

79:名称未設定
07/06/13 17:06:39 tx1aMvDC0
65です
>>76さん
ありがとうございます。試してみます。
やはりヒレガス本ですか、探してみます。

80:名称未設定
07/06/13 17:09:20 tx1aMvDC0
>>78さん
あぁぁ、そうですか...もっともっとググってみます。

81:66
07/06/13 17:33:57 SjgSRBeA0
>>77
ログの表示はそのままの意味ですよ。
別nib の File'sOwner に設定しているカスタムクラスでmanagedObjectContextを実装しなきゃ。

>>79
コピーした*_AppDelegate.m(h)内のクラス名も適当に変えてね。
addPersistentStoreWithTypeに使うURLも変更した方がいいかも。
ま、がんばって。

82:名称未設定
07/06/13 18:07:38 Dc2vvK7R0
CoreData以前にバインディングとかnibファイルのオーナーシップとか全然理解してないんじゃないの?

まずCoreDataのデータはNSManagedObjectContextが管理していて、
デフォルトではHoge_AppDelegateがこいつをmanagedObjectContextとして持っている
だから別のnibファイルからCoreDataのデータにアクセスするにはHoge_AppDelegateへのアウトレットを確保しなくてはならない
AppDelegateをオーナーにしてnibを読み込めばFiles Owner.managedObjectContextとしてバインドできるけど、
MVCの観点からあまりよろしくないので、
別途コントローラオブジェクト(HogeControllerとか)を作ったほうが良い
で、MainMenu.nibでHogeControllerをインスタンス化しておいてHoge_AppDelegateへのアウトレットセットしておく
で別ウィンドウを開く際にはHogeControllerをオーナーにしてnibをロードする
でその別nibではArrayControllerにFile's Owner.hoge_AppDelegate.managedObjectContextをバインドしてやればOK
ちなみにFile's OwnerはもちろんHogeControllerのことで、
hoge_AppDelegateはHoge_AppDelegateへのアウトレットの名前な

83:名称未設定
07/06/13 19:46:19 SjgSRBeA0
>>82
すばらしい。

今となってはどうでもいいけど>>76で、
applicationShouldTerminateをapplicationDidFinishLaunchingと勘違いしてました...

84:名称未設定
07/06/13 20:51:51 tx1aMvDC0
65です。
>>82さん、アドバイスありがとうございます。

>CoreData以前にバインディングとかnibファイルのオーナーシップとか全然理解してないんじゃないの?
ご指摘の通りです、勉強不足ですいません、がんばって勉強します

>>82さんにアドバイス頂いた手順でチャレンジしてますが、
バインディングの部分がうまくいかなくて見直しています。
実行すると実行ログにこんなエラーが吐かれます
addObserver:<<NSAutounbinder: 0xa37e6494> 0x3ccee0> forKeyPath:@"appDelegate.managedObjectContext" options:0x0 context:0x3cd2f0] was sent to an object that is not KVC-compliant for the "appDelegate" property.
バインディングができてないんでしょうか...
再度プロジェクトを起こし直して確認してみます

あと手順上の話なのですが、メニューバーからFile->Newして
複数の同じウィンドウの表示をしたいのが目的なので、
MainMenu.nibでHogeControllerをインスタンス化してしまうと、
複数ウィンドウの表示ができなくなってしまうと思っています。
AppDelegateの中にFile->Newから呼ばれるActionを書いて、
WindowControllerをalloc&initして
WindowControllerのinitでNibをロードするように最初は書いていました。
こういう書き方は良くないんでしょうか

目指してるイメージは、HMDT赤本のチュートリアルにあるiTunesブラウザが、
File->Newするたびに新しいウィンドウが増えていくイメージなんですが
思うようにできないです...

ヒレガス本、近所の本屋にありませんでした...残念

85:名称未設定
07/06/13 21:43:36 jSrM7oaF0
>84
>メニューバーからFile->Newして複数の同じウィンドウの表示をしたい

んならNewProjectでCore Data Document-based Applicationえらべ。
Introduction to NSPersistentDocument Core Data Tutorialよむといい。英語だが。

86:名称未設定
07/06/13 22:28:01 tx1aMvDC0
65です。
>>85さん
そうなんですがDocument-basedにすると、開いたウィンドウ毎に
CoreDataのファイルが作られてしまうのでダメなんです。
CoreDataのファイルは常に一つにしたいのでnon-Documentの
プロジェクトで作っています。

87:名称未設定
07/06/13 23:23:11 Yueo7NwZ0
>>86
single-model multi-windowにするには、
NSDocumentのmakeNewWindowControllerかwindowControllerClassをオーバーライドする。
と、俺様メモに書いてある。

自分で書いたメモなのに意味不明ですが、お役に立つでしょうか?


88:名称未設定
07/06/13 23:25:54 jSrM7oaF0
>86
>ファイルは常に一つにしたい

MyDocumentのinitで「常に一つ」を読み込むように実装したら駄目か。


89:名称未設定
07/06/14 01:30:25 Cj65MRJ40
>>84
まずエラーの内容は理解してる?
バインドした対象(File's Ownerの何かだと思うけど)がappDelegateというプロパティを持っていないということ
File's Ownerに設定したオブジェクトがappDelegateというアウトレットを持っているかどうかを確認、
持っているならFile's Ownerが正しくそのオブジェクトになっているかを確認する

>AppDelegateの中にFile->Newから呼ばれるActionを書いて、
>WindowControllerをalloc&initして
>WindowControllerのinitでNibをロードするように最初は書いていました。
>こういう書き方は良くないんでしょうか
それでたぶんあってる
詳しくはヒレガス本読め
で、WindowControllerをinitしたら
[windowController setValue:(managedObjectContextを持っているオブジェクト) forKey:@"appDelegate"];
で、セットしてやれば良い
つうかmanagedObjectContextを直接渡しても良いかな

>>87
それは一つのNSDocumentに対して複数のウィンドウを開くときじゃない?
URLリンク(developer.apple.com)

>>88
そうすると複数のウィンドウで同時に編集した場合、データの矛盾が起きると思う。
データストアは一つにしておいてそいつに対してバインドすれば
あるウィンドウでの変更は即座に他のウィンドウに反映されるので問題は起きないはず

90:名称未設定
07/06/14 02:57:57 NSgFd5Po0
>>84
ちょっと甘えすぎかも。

>MainMenu.nibでHogeControllerをインスタンス化してしまうと、
>複数ウィンドウの表示ができなくなってしまうと思っています。
HogeControllerはHoge_AppDelegate(単一のmanagedObjectContext)へのアクセスを提供しているだけなので問題なし。

>WindowControllerのinitでNibをロードするように最初は書いていました。
initってinitWithWindowNibName:owner:だよね。だったら問題なし。

>目指してるイメージは、HMDT赤本のチュートリアルにあるiTunesブラウザが、
>File->Newするたびに新しいウィンドウが増えていくイメージなんですが
>思うようにできないです...
>>82さんの書かれた方法で可能だと思うよ。

>ヒレガス本、近所の本屋にありませんでした...残念
CoreData、CocoaBinding、その他基本的なものはADCに翻訳されたドキュメントあるよ。
なんだかんだいってある程度分かってるようなので、それらをちゃんと読むのがいいんじゃない?

91:名称未設定
07/06/14 17:59:54 xP8dIeTp0
65です。
>>89さんのsetValue:forKey:をしたらできるようになりました。
わたしのバインディングに関する勉強不足でした

>>87さん、>>88さん
すいません。勉強不足でアドバイスの内容に追い付けません。。。

>>89さん
ご指摘の通りappDelegateにオブジェクトが設定がありませんでした。
>[windowController setValue:(managedObjectContextを持っているオブジェクト) forKey:@"appDelegate"];
をしたらエラーもなく表示できるようになりました。

>>90さん
>initってinitWithWindowNibName:owner:だよね。だったら問題なし。
[NSBundle loadNibNamed:@"Window" owner: self];
と書いてますがloadNibNamed:owner:はよくないのでしょうか

ADCの翻訳ドキュメントをもっと読んでみます。

92:名称未設定
07/06/14 18:06:48 xP8dIeTp0
65です。
参考にならないと思いますが、うまくいったコードです。
MainMenu.nib の hoge_AooDelegate のコード

##### hoge_AppDelegate.h
#import "WindowController.h"
@interface hoge_AppDelegate : NSObject
{
WindowController *windowController;
…この下に自動生成されたコードがあります…
}
- (IBAction)newWindow:sender;
…この下に自動生成されたコードがあります…
@end

##### hoge_AppDelegate.m
@implementation hoge_AppDelegate
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] init];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
…この下に自動生成されたコードがあります…
@end

93:名称未設定
07/06/14 18:08:07 xP8dIeTp0
65です。
つづきです。

コントローラです。

#####WindowController.h
@interface WindowController : NSWindowController {
IBOutlet id window;
id hoge_AppDelegate;
}
@end

#####WindowController.m
@implementation WindowController
- (id) init{
[NSBundle loadNibNamed:@"Window" owner: self];
return self;
}
- (void) windowWillClose:(NSNotification *)aNotification
{
[self release];
}
@end

94:名称未設定
07/06/14 20:33:46 cQfpjLW60
>>93
最初はこんなもんかな。最後にアドバイスしとくね。

loadNibNamed:owner:は機能としては問題ないと思うけど、
NSWindowControllerを継承してるんだったら素直にinitWithWindowNibName:owner:使おうよ。
windowアウトレットはNSWindowControllerに最初からついてるし。
そうするとWindowControllerのinitとwindowWillCloseは不要になって、
- (IBAction)newWindow:(id)sender
{
windowController = [[NSWindowController alloc] initWithWindowNibName:@"Window" owner:nil];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
こんな風にシンプルにできるよ。

ついでにinitWithWindowNibName:owner:のownerに適切なオブジェクトをセットすると、
[windowController setValue:self forKey:@"hoge_AppDelegate"];
も不要にできるけど説明がめんどい。

ま、がんばって。

95:94
07/06/14 20:46:30 cQfpjLW60
訂正。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window" owner:nil];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
つい「別にWindowControllerいらねーじゃん」の思いが出てしまいました。

96:94
07/06/14 21:08:57 cQfpjLW60
また訂正。スレ汚しごめん。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window"];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
owner:nilじゃ動かないよね。
限界だわ、もう寝る。

97:名称未設定
07/06/14 22:26:11 2hMmY5410
>>91
横から失礼します。
AppDelegateは[NSApp delegate]で参照できます。
ですから、わざわざvalueを渡す必要はないでしょう。
たとえばWindowControllerに
- (NSManagedObjectContext *) managedObjectContext {
return [[NSApp delegate] managedObjectContext];
}
とすれば、後はIBで設定するだけです。

動作確認できたらリファクタリングして、MainMenu.nibはmenuとAppDelegateのみにして、
残りはDocument.nib(?)に移行すると後々楽になると思います。

入手困難かもしれませんが、ヒレガス本をお薦めします。
長年NextStepのbootCampをしてきた人だけに、ツボを押さえた構成になっています。
bindingやcoredataはのっていませんが、notification等が不要になったわけではありません。
第3版が秋以降に予定されているらしいので、それの訳本が出るとよいのですが、、




98:名称未設定
07/06/14 23:15:33 EPxV4jRU0
すみません。
教えていただけますか?
NSScrollViewをscrollしたとき、ScrollViewにセットされているviewを再描画したいのですが、
どうすればよいですが?
よろしくおねがいします。

99:89
07/06/15 00:55:46 Z8G4DJVj0
>>97
>AppDelegateは[NSApp delegate]で参照できます。
そっか、CoreData使ったソフトは実際には作ったこと無かったのでそれは思いつかなかった。
>>82でちょっと回りくどいことを書いてすまんかった。
ただまあ>>65はCoreData以前のいろいろをちゃんと理解した方が良いな
WindowControllerの使い方にしても>>94のやり方が正解だし。
ということでヒレガス本をちゃんと読みなさい。
Try&Errorも時には必要だけど、わけわからないままむやみにあれこれいじっても効率悪いだけだから。

100:名称未設定
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
オブジェクト定数に日本語使ったからエラー出たんじゃね?


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