1 Name: 名称未設定 [sage] Date: 2007/05/18(金) 23:24:52 ID: ZBDhxXyy0 Be:
初心者は教えてくれる方への感謝を忘れずに。
上級者も初心者だった頃の気持ちを忘れずに。

前スレ
Cocoaはさっぱり!!! version.7
http://pc11.2ch.net/test/read.cgi/mac/1161486802/
2 Name: 名称未設定 [sage] Date: 2007/05/18(金) 23:29:22 ID: UJP3ocn+0 Be:
乙かれーしょん
3 Name: 名称未設定 [sage] Date: 2007/05/19(土) 00:43:34 ID: sciB+uL40 Be:
1000 名前: 名称未設定 Mail: sage 投稿日: 2007/05/19(土) 00:29:23 ID: uGrJMnws0
[self release];
4 Name: 名称未設定 [sage] Date: 2007/05/19(土) 08:47:22 ID: VgPVILTS0 Be:
カーボンが4げっt
5 Name: 名称未設定 [sage] Date: 2007/05/19(土) 10:43:00 ID: ndYGZwPE0 Be:
前スレ1000の秀逸さに感動した俺は新参?
6 Name: 名称未設定 [sage] Date: 2007/05/19(土) 11:43:25 ID: uJS6/6lK0 Be:
[self release]; というのはあまり使わないような気がする。
7 Name: 名称未設定 [sage] Date: 2007/05/19(土) 11:57:48 ID: K8wpdP1P0 Be:
-init内で何かミスったときとか。
8 Name: 名称未設定 [sage] Date: 2007/05/19(土) 13:47:34 ID: 6RJB6in20 Be:
じゃ次は [super dealloc] で。
9 Name: 名称未設定 [sage] Date: 2007/05/19(土) 15:01:23 ID: 7fei3xwy0 Be:
autorelease されて持ち主のいないウインドウは勝手に閉じてしまうので、自分を
retainして、閉ボタンが押されたときに [self release]; するのは邪道ですか
10 Name: 名称未設定 [sage] Date: 2007/05/19(土) 20:37:55 ID: jAL67W1S0 Be:
ShiftJIS のCSVを開いて、パースするプログラムを書いているのですが、日本語が含まれているとうまく処理できません。日本語が含まれているセルの結果が、文字コードで表示されてしまいます。
1行切り出した段階のparsedStringをNSLogで表示させるとうまく日本語が表示されますが、その後の、columnArrayではうまく表示できません。
何が悪いのか、まったく見当がつきません。どなたか、教えてください。
11 Name: 名称未設定 [sage] Date: 2007/05/19(土) 20:38:45 ID: jAL67W1S0 Be:
上の続きです

//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 Name: 名称未設定 [sage] Date: 2007/05/19(土) 20:42:04 ID: jAL67W1S0 Be:
ほんと長くてすみませんorz


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

[rowArray addObject:columnArray];
}

長文ですみません。。。
13 Name: 名称未設定 [sage] Date: 2007/05/19(土) 21:19:06 ID: 7fei3xwy0 Be:
NSArray の description はプロパティリスト形式でエンコードされたものを返すから。
columnArrayの中には正しい値で格納されているはず。
14 Name: 名称未設定 [sage] Date: 2007/05/19(土) 23:06:23 ID: KTFjrMhL0 Be:
要は、NSLog(@"%@", columnArray);
にしとけと、そういう事です。
15 Name: 名称未設定 [sage] Date: 2007/05/20(日) 01:06:30 ID: 95dk2TSg0 Be:
>>14
>要は、NSLog(@"%@", columnArray);
え、それって結局 [columnArray description] なんじゃなかったっけ?

ところで >>11 のコードだけど、
NSLog() に直接文字列を渡すのはあんまりよくないかな。些細なことだが。
16 Name: 名称未設定 [sage] Date: 2007/05/20(日) 03:58:14 ID: Q4ZcZ5bJ0 Be:
文字列にメタキャラがあったら不味いわな。
17 Name: 名称未設定 [sage] Date: 2007/05/20(日) 08:12:37 ID: Wl6kGVzP0 Be:
ありがとうございます。
>>13
中身に正しく格納されているのを確かめるには、どうすればいいのでしょうか。
NSLog(@"%@" , [columnArray objectAtIndex:2]);
などとして、日本語が含まれるであろうところを表示させても、何も表示されません。
>>14
%@で指定すると、そのオブジェクトのdescriptionが呼び出されるはずなので、同じ結果ですが。
>>15
NSLog()に直接文字列を渡すのはよくないってのは、どういうことですか?
NSLog([parsedString description]);
とすべきということでしょうか。
>>16
文字列にメタキャラがあるとは、どういうことでしょうか?
メタキャラと言われても、正規表現で使う記号のことしか思い浮かばないのですが。
18 Name: 名称未設定 [sage] Date: 2007/05/20(日) 08:45:26 ID: VLuBbFIP0 Be:
NSLogや-descriptionはローカライズされた文字表示には使えない。
エンコーディングが指定出来ないから。
日本語文字を表示したいのなら、自前でNSLog(@"%@",hoge)に相当
するメソッドを作る。

メタキャラの話は、format string vulnerabilityでググれ。いわゆる鉄則。
19 Name: 名称未設定 [sage] Date: 2007/05/20(日) 10:42:46 ID: g8ihdvQq0 Be:
writeToFile でファイルに書き出して、Property List Editor で開いてみるとか
20 Name: 名称未設定 [sage] Date: 2007/05/20(日) 12:11:09 ID: S8wwiPq80 Be:
NSPopUpButton を使ったユーザーインターフェイスで、
選択する項目が1つしかないときは NSPopUpButton ではなく
同じ位置に NSTextField でその項目を表示したいのですが、
状態に応じて NSPopUpButton と NSTextField を入れ替える、
というようなことが、IB 上、あるいはコードから可能でしょうか。

見た目だけなら、それぞれの setHidden を入れ替えればできることはできますが、
IB 上で同じ位置に NSPopUpButton と NSTextField を置かなければならず
編集等がやりにくいので、NSPopUpButton と NSTextField とを入れ替える、
ということがしたいです。
21 Name: 名称未設定 [sage] Date: 2007/05/20(日) 12:31:47 ID: ZfxNfI7k0 Be:
それUI設計を考え直したほうが良いんじゃ。
22 Name: 名称未設定 [sage] Date: 2007/05/20(日) 12:44:40 ID: G1nQj3380 Be:
NSComboBoxじゃ駄目なの?
23 Name: 名称未設定 [sage] Date: 2007/05/20(日) 14:30:35 ID: EIWpzyux0 Be:
>>17
NSArray *columnArray = [@"%@,%s" componentsSeparatedByString: @","];
NSLog(columnArray);
でいいことがあるよ!
NSLog(@"%@", [columnArray componentsJoinedByString: @" "]);

>>20
NSComboBoxが本命、またはaddSubview:/removeFromSuperviewと思うけど、IBでの編集が目的なら
NSTabViewに入れればいいんじゃね?
24 Name: 20 [sage] Date: 2007/05/20(日) 15:07:36 ID: S8wwiPq80 Be:
>>22 >>23
NSComboBox は今まで使ったことがありませんでした。
ありがとうございます。調べてみます。

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

NSTabView は迷ったのですが、NSPopUpButton と NSTextField とを
入れ替えたいものとそうでないものとが UI のレイアウト上散在しているので、
今回の場合ちょっと使いにくいかなと思いました。
25 Name: 名称未設定 [sage] Date: 2007/05/20(日) 15:29:52 ID: g8ihdvQq0 Be:
やろうとしていることがよくわからないんだけど
選択する項目が一つしかないときに表示するNSTextFieldは編集できなくていいの?
項目が一つのときはポップアップのUIがうざいからシンプルなNSTextFieldにしたい、ということ?
それならボーダレスにすればシンプルな表示になるけど。
26 Name: 20 [sage] Date: 2007/05/20(日) 17:40:05 ID: S8wwiPq80 Be:
>>25
すみません、わかりにくい書き方でした。

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

編集モードのときには、選択肢のあるデータは NSPopUpButton 風に表示し
(ユーザーが選択可能)、削除モードのときには、選択されているデータを
NSTextField 風に表示する(表示のみ、選択、編集は不可)という
インターフェイスにしようとしています。
27 Name: 名称未設定 [sage] Date: 2007/05/20(日) 17:50:19 ID: SHOl/NGE0 Be:
NSPopUpButton 1つにして
-(void)setBordered:(BOOL)flag;
-(void)setBezelStyle:(NSBezelStyle)bezelStyle;
-(void)setEnabled:(BOOL)flag;
を組み合わせればいいんでないか?
28 Name: 名称未設定 [sage] Date: 2007/05/20(日) 21:06:22 ID: Wl6kGVzP0 Be:
>>18 >>19
ありがとうございます。

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

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

>>23
どういうことでしょうか。
エラーになって、落ちてしまうのですが・・・。
29 Name: 名称未設定 [sage] Date: 2007/05/20(日) 22:15:06 ID: EIWpzyux0 Be:
>>28
>>23の上2行
>>17,28
>文字列にメタキャラがある
NSLog(columnArray); NSLog([parsedString description]);では「%@,%s」が入力ファイル中に
あったらまずいという話。
30 Name: 名称未設定 [sage] Date: 2007/05/21(月) 07:41:23 ID: 7LGNLKMD0 Be:
>>29
なるほど。
メタキャラがあるとエラーで落ちてしまう例だったのですね。
31 Name: 名称未設定 [sage] Date: 2007/05/21(月) 23:12:19 ID: TdM0ZjG7O Be:
落ちるだけならいいんだけどね。vulnerabilityなんで悪用されるかも。
32 Name: 名称未設定 [sage] Date: 2007/05/29(火) 09:39:57 ID: Z+NxGNZg0 Be:
Cocoaスクリプタブルなアプリケーション、モダンな
書き方のサンプルコードってどのあたりを見たらよいでしょうか。

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

ただ、やっぱりscriptSuite+Terminologyの古いやり方でした。
10.3.xを切り捨てるとすると、新しい記述方法が使えると思うの
ですが、お勧めなサンプルコードがあれば教えてください。
33 Name: 名称未設定 [sage] Date: 2007/05/29(火) 21:18:28 ID: a00qDN0E0 Be:
Pasteboard に適切でないもの
[pb setData:@"string" forType:... ];
とかを書き込むと、全てのプロセスが停止に至ってしまうのはウチ(10.4.9)だけ?
34 Name: 名称未設定 [sage] Date: 2007/05/30(水) 13:27:49 ID: M44/L4u50 Be:
自分で作成したクラス(AppControllerとか)で、NSArrayContorollerでの選択されているオブジェクトの変更を受け取るには、どうすればいいのでしょうか。
つまり、自分で作成したクラスに、NSArrayControllerから選択されているオブジェクトの変更があるたびに、アクションを送信してもらうには、どうしたらいいのでしょうか。
35 Name: 名称未設定 [sage] Date: 2007/05/30(水) 16:09:06 ID: E2XSp/Pe0 Be:
>>34
NSKeyValueObservingでNSArrayContorollerのselectionを監視。
もしくはNSTableViewのnotificatioかdelegate経由。
もしくはNSNotificationで自分の好きなように。
36 Name: 名称未設定 [sage] Date: 2007/05/31(木) 15:44:40 ID: OPvQwZSL0 Be:
>>32

10.5のScript Bridgeの事?
37 Name: 名称未設定 [sage] Date: 2007/05/31(木) 17:55:14 ID: o/25uG0z0 Be:
>>36
いえ、sdefの話です。調べていたらそのものズバリの回答がありました。

>ttp://developer.apple.com/jp/technotes/tn2106.html

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

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

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

このいきなり起動するっていう事象、悩んでいたんですけど、ちゃんと
ドキュメントが有ったんですね。
38 Name: 名称未設定 [sage] Date: 2007/05/31(木) 21:25:46 ID: zK9AEhFO0 Be:
>>35
NSKeyValueObservingで、実装することにしました。
ありがとうございます。
39 Name: 名称未設定 [] Date: 2007/06/02(土) 14:18:31 ID: sT94ODrc0 Be:
Drawerって親ウィンドウのサイズに依存しますよね。
横に細長なウィンドウだと、Drawer付けられないんですが
なんかいい方法ない?
40 Name: 名称未設定 [sage] Date: 2007/06/02(土) 14:58:26 ID: PljomMdh0 Be:
下に出す。
41 Name: 名称未設定 [sage] Date: 2007/06/03(日) 13:05:44 ID: mna10Y1g0 Be:
えくすきゅーずみー!
CoreDataで作ったEntityを途中で変更したとき、永続化させているデータの構造を
変更する手段って用意されているのでしょうか?
よいじかんをー!
42 Name: 名称未設定 [sage] Date: 2007/06/03(日) 14:39:27 ID: b0tdP23k0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/03(日) 15:11:20 ID: mna10Y1g0 Be:
>>42さん ありがとう
まいせるふで解決するよー
44 Name: 名称未設定 [sage] Date: 2007/06/07(木) 04:12:52 ID: TxansO1r0 Be:
QTMovieViewでDRM付きのm4vが再生できないのは
当然なんですか?
45 Name: 名称未設定 [sage] Date: 2007/06/07(木) 19:16:07 ID: iiSZh04z0 Be:
あれ、できなかったっけ。
46 Name: 名称未設定 [sage] Date: 2007/06/08(金) 11:19:17 ID: rvM2Yx/u0 Be:
やってみたけど、DRM 付きの m4p は聞けた。
m4v は持ってないので確認できない。
47 Name: 名称未設定 [sage] Date: 2007/06/08(金) 20:19:35 ID: rlaJ3J8O0 Be:
10.3.9で試してみたけど、再生できなかった。
m4pならできたけど。
48 Name: 名称未設定 [] Date: 2007/06/10(日) 18:26:33 ID: hI0cu8D+0 Be:
NSOutlineViewとNSTableViewの垂直スクロールが同期した
プログラムを書こうと思っています。
NSTableViewへの値の設定は[treeTableView setBoundOrigin:pos];
で出来ることがわかったのですが、NSOutlineViewからの垂直
スクロール値の読み出し方法がわかりません。
ご存じの方、ご教授ください。
49 Name: 名称未設定 [] Date: 2007/06/10(日) 18:29:08 ID: xqak4VE+0 Be:
fffff
50 Name: 名称未設定 [sage] Date: 2007/06/10(日) 20:09:47 ID: s3V0Kn6M0 Be:
NSOutlineViewってNSTableViewのサブクラスじゃなかったっけ?
51 Name: 名称未設定 [sage] Date: 2007/06/10(日) 20:10:05 ID: tHbw2xow0 Be:
NSScroller の floatValue かな
値設定は setFloatValue:knobProportion: で。
52 Name: 48 [] Date: 2007/06/11(月) 09:37:46 ID: 1ykIS/Rk0 Be:
ダメです。InterfaceBuilderでNSScrollViewは関連づけできますが、
NSScrollerは関連づけができません。
53 Name: 名称未設定 [sage] Date: 2007/06/11(月) 09:56:44 ID: 9X1rbhME0 Be:
xxx.h
.
.
IBOutlet NSScrollView* scrollView;// IBで関連づける
NSScroller* hScroller; // 初期化メソッドで値を設定する

初期化メソッドかsetScrollViewで
xxx.m
.
.
hScroller = [scrollView horizontalScroller];
}
ってやるのはどうですか
54 Name: 名称未設定 [sage] Date: 2007/06/11(月) 09:57:09 ID: T3nP0R6O0 Be:
InterfaceBuilder 使わなけりゃいいだろ。
55 Name: 名称未設定 [sage] Date: 2007/06/11(月) 10:04:04 ID: T3nP0R6O0 Be:
NSTableView と NSOutlineView の垂直スクロールを同期させるというのが良く分からん。
表示中の行の数が同じでなければ setFloatValue: を使っても同期にならないだろうが、
NSOutlineView を使ってるということは折り畳まれた行が存在することが考えられるから
表示中の行の数が同じとも限らんし。
56 Name: 48 [] Date: 2007/06/11(月) 17:24:05 ID: 1ykIS/Rk0 Be:
>>51
'NSScroller'may not respond to '-floatValue:'でした。
57 Name: 名称未設定 [sage] Date: 2007/06/11(月) 17:32:32 ID: mbR9EhtI0 Be:
(1) floatValue: ではなくて floatValue になっている?
(2) 警告出ても無視していいから、それで動いたの?
58 Name: 48 [] Date: 2007/06/11(月) 20:10:36 ID: 1ykIS/Rk0 Be:
(1)はい
(2)警告を無視したら56番のメッセージが表示されて作動しません
59 Name: 名称未設定 [sage] Date: 2007/06/11(月) 20:21:35 ID: mbR9EhtI0 Be:
コードがどこかおかしいはず。
これで普通に動いたよ。

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

60 Name: 48 [] Date: 2007/06/12(火) 00:36:50 ID: TYIgO7qC0 Be:
ありがとうございます。無事動きました。
しかし、これでは使い物にならないですね~
61 Name: 名称未設定 [sage] Date: 2007/06/12(火) 01:12:00 ID: luus+mNL0 Be:
具体的に何をしたいのか分からんから
使い物にならないと言われても
そーですかとしか言いようが無い

まあ、標準の部品で実現できそうにないことなら
その表現方法が本当に正しいのかを疑ってみるべきかもしれない
62 Name: 名称未設定 [sage] Date: 2007/06/12(火) 05:03:25 ID: LE6VV2Gm0 Be:
自分の望んでいたことが無事にできたのに、使い物にならないっておかしくないか
63 Name: 名称未設定 [sage] Date: 2007/06/12(火) 09:39:58 ID: iZm9RHNQ0 Be:
他人が親切に教えてやってるのに、使い物にならない、の一言で切り捨てる
48は以後スルーでよし。
64 Name: 名称未設定 [sage] Date: 2007/06/12(火) 11:44:23 ID: 9fyh4C1c0 Be:
safari for windowsでmkinoさん涙目?
65 Name: 名称未設定 [] Date: 2007/06/12(火) 16:22:42 ID: w6MMEnQe0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/12(火) 17:06:00 ID: drt+veFf0 Be:
>>65
まず一回ちゃんと本読めよ...
67 Name: 名称未設定 [sage] Date: 2007/06/12(火) 17:07:42 ID: Q66+HK1K0 Be:
>>65
http://tbboy.cocolog-nifty.com/tbboys_room/2006/08/itunes_935d.html
手前味噌だが。
68 Name: 名称未設定 [sage] Date: 2007/06/12(火) 18:26:16 ID: DylgJ4Wp0 Be:
>>65
>AppDelegateと新しいnibのFile'sOwnerの関係やら
ヒレガス本読め
69 Name: 名称未設定 [] Date: 2007/06/12(火) 19:54:42 ID: rm3r2fE/0 Be:
CocoaにHTTP のライブラリはありますか?

一体どこにライブラリの説明があるのか良く分からなくて。。。
70 Name: 名称未設定 [sage] Date: 2007/06/12(火) 20:31:33 ID: ZolpA+Sn0 Be:
>>69
「HTTPのライブラリ」だけだとなんとも..
クライアント側ならNSURLRequest+NSURLConnection/NSURLDownloadで
だいたいできるんじゃないかな。delegateである程度制御できるし。

もっと細かいことがしたい、もしくはサーバ側の実装をするなら
CFHTTPなどのCFNetworkのC API(非Cocoa)だと思うよ。
71 Name: 名称未設定 [] Date: 2007/06/12(火) 23:36:14 ID: eoZFaP4J0 Be:
safari for winはcocoa on win(旧open step)で実装したの?
72 Name: 名称未設定 [sage] Date: 2007/06/13(水) 04:42:32 ID: RFkwfKY60 Be:
HMDT読め。
73 Name: 名称未設定 [] Date: 2007/06/13(水) 07:47:43 ID: tx1aMvDC0 Be:
65です。
>>66さん
HMDT赤本を読んでみたのですが、別のnibを使うようなサンプルがなく
よくわかってません、すいません。
>>67さん
参考にしてみます。ありがとうございます。
>>68さん
本屋でヒレガス本を探してみます。

ADCのサイトを見てますが探し方が悪いのと英語なので苦労してます。
Cocoaのプログラムを作る時の、nibの持ち方はこうするべき、
リソースはこう持つべき、全体としてこう作るべきとか等の、
定石などがわかるような文献やサイトがあればいいのですが。。。
74 Name: 69 [] Date: 2007/06/13(水) 08:40:50 ID: jcr/KQtr0 Be:
thx>>70

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

CFNetworkをググってみまつ。
75 Name: 名称未設定 [] Date: 2007/06/13(水) 13:29:46 ID: aXtlj5LE0 Be:
>>73
AppDelegateのインスタンスが無いっていうなら,
クラス一覧からAppDelegateをインスタンス化(Instantiate?)すればいいんじゃないの?
Core Dataほとんどやってないから合ってるかわからんけど.
76 Name: 66 [sage] Date: 2007/06/13(水) 16:52:12 ID: SjgSRBeA0 Be:
>>73
(私もCoreDataは使ってないから分からないけど)ちょっと見た限り、
>>75さんのいうようにオリジナルのAppDelegateを流用すればいけるんじゃないかな。

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

私も(読んだ事ないけど)ヒレガス本を推薦しておきます。
77 Name: 名称未設定 [] Date: 2007/06/13(水) 17:02:23 ID: tx1aMvDC0 Be:
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 Name: 66 [sage] Date: 2007/06/13(水) 17:05:43 ID: SjgSRBeA0 Be:
日本語版は内容が古過ぎるみたいなので、やっぱりヒレガス本推薦取り消します。
そのぐらいなら日本語のサイトでも十分勉強できると思うし。
(実際、私は日本語のサイトの情報だけでやってこれましたよ)
79 Name: 名称未設定 [] Date: 2007/06/13(水) 17:06:39 ID: tx1aMvDC0 Be:
65です
>>76さん
ありがとうございます。試してみます。
やはりヒレガス本ですか、探してみます。
80 Name: 名称未設定 [sage] Date: 2007/06/13(水) 17:09:20 ID: tx1aMvDC0 Be:
>>78さん
あぁぁ、そうですか...もっともっとググってみます。
81 Name: 66 [sage] Date: 2007/06/13(水) 17:33:57 ID: SjgSRBeA0 Be:
>>77
ログの表示はそのままの意味ですよ。
別nib の File'sOwner に設定しているカスタムクラスでmanagedObjectContextを実装しなきゃ。

>>79
コピーした*_AppDelegate.m(h)内のクラス名も適当に変えてね。
addPersistentStoreWithTypeに使うURLも変更した方がいいかも。
ま、がんばって。
82 Name: 名称未設定 [sage] Date: 2007/06/13(水) 18:07:38 ID: Dc2vvK7R0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/13(水) 19:46:19 ID: SjgSRBeA0 Be:
>>82
すばらしい。

今となってはどうでもいいけど>>76で、
applicationShouldTerminateをapplicationDidFinishLaunchingと勘違いしてました...
84 Name: 名称未設定 [sage] Date: 2007/06/13(水) 20:51:51 ID: tx1aMvDC0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/13(水) 21:43:36 ID: jSrM7oaF0 Be:
>84
>メニューバーからFile->Newして複数の同じウィンドウの表示をしたい

んならNewProjectでCore Data Document-based Applicationえらべ。
Introduction to NSPersistentDocument Core Data Tutorialよむといい。英語だが。
86 Name: 名称未設定 [sage] Date: 2007/06/13(水) 22:28:01 ID: tx1aMvDC0 Be:
65です。
>>85さん
そうなんですがDocument-basedにすると、開いたウィンドウ毎に
CoreDataのファイルが作られてしまうのでダメなんです。
CoreDataのファイルは常に一つにしたいのでnon-Documentの
プロジェクトで作っています。
87 Name: 名称未設定 [sage] Date: 2007/06/13(水) 23:23:11 ID: Yueo7NwZ0 Be:
>>86
single-model multi-windowにするには、
NSDocumentのmakeNewWindowControllerかwindowControllerClassをオーバーライドする。
と、俺様メモに書いてある。

自分で書いたメモなのに意味不明ですが、お役に立つでしょうか?
88 Name: 名称未設定 [sage] Date: 2007/06/13(水) 23:25:54 ID: jSrM7oaF0 Be:
>86
>ファイルは常に一つにしたい

MyDocumentのinitで「常に一つ」を読み込むように実装したら駄目か。
89 Name: 名称未設定 [sage] Date: 2007/06/14(木) 01:30:25 ID: Cj65MRJ40 Be:
>>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に対して複数のウィンドウを開くときじゃない?
http://developer.apple.com/jp/documentation/cocoa/Conceptual/Documents/Tasks/FAQ.html#//apple_ref/doc/uid/20000954

>>88
そうすると複数のウィンドウで同時に編集した場合、データの矛盾が起きると思う。
データストアは一つにしておいてそいつに対してバインドすれば
あるウィンドウでの変更は即座に他のウィンドウに反映されるので問題は起きないはず
90 Name: 名称未設定 [sage] Date: 2007/06/14(木) 02:57:57 ID: NSgFd5Po0 Be:
>>84
ちょっと甘えすぎかも。

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

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

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

>ヒレガス本、近所の本屋にありませんでした...残念
CoreData、CocoaBinding、その他基本的なものはADCに翻訳されたドキュメントあるよ。
なんだかんだいってある程度分かってるようなので、それらをちゃんと読むのがいいんじゃない?
91 Name: 名称未設定 [sage] Date: 2007/06/14(木) 17:59:54 ID: xP8dIeTp0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/14(木) 18:06:48 ID: xP8dIeTp0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/14(木) 18:08:07 ID: xP8dIeTp0 Be:
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 Name: 名称未設定 [sage] Date: 2007/06/14(木) 20:33:46 ID: cQfpjLW60 Be:
>>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 Name: 94 [sage] Date: 2007/06/14(木) 20:46:30 ID: cQfpjLW60 Be:
訂正。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window" owner:nil];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
つい「別にWindowControllerいらねーじゃん」の思いが出てしまいました。
96 Name: 94 [sage] Date: 2007/06/14(木) 21:08:57 ID: cQfpjLW60 Be:
また訂正。スレ汚しごめん。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window"];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
owner:nilじゃ動かないよね。
限界だわ、もう寝る。
97 Name: 名称未設定 [sage] Date: 2007/06/14(木) 22:26:11 ID: 2hMmY5410 Be:
>>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 Name: 名称未設定 [] Date: 2007/06/14(木) 23:15:33 ID: EPxV4jRU0 Be:
すみません。
教えていただけますか?
NSScrollViewをscrollしたとき、ScrollViewにセットされているviewを再描画したいのですが、
どうすればよいですが?
よろしくおねがいします。
99 Name: 89 [sage] Date: 2007/06/15(金) 00:55:46 ID: Z8G4DJVj0 Be:
>>97
>AppDelegateは[NSApp delegate]で参照できます。
そっか、CoreData使ったソフトは実際には作ったこと無かったのでそれは思いつかなかった。
>>82でちょっと回りくどいことを書いてすまんかった。
ただまあ>>65はCoreData以前のいろいろをちゃんと理解した方が良いな
WindowControllerの使い方にしても>>94のやり方が正解だし。
ということでヒレガス本をちゃんと読みなさい。
Try&Errorも時には必要だけど、わけわからないままむやみにあれこれいじっても効率悪いだけだから。
100 Name: 名称未設定 [sage] Date: 2007/06/15(金) 02:50:11 ID: bwuLJcag0 Be:
>>98
NSViewBoundsDidChangeNotificationはどう?
101 Name: 名称未設定 [] Date: 2007/06/15(金) 14:58:04 ID: ylLFz9lv0 Be:
>>100
ばっちり出来ました!!
ありがとうございます。
102 Name: 名称未設定 [sage] Date: 2007/06/15(金) 17:31:25 ID: sL1ajDrz0 Be:
65です。
>>94さん
具体的なコードでのアドバイスありがとうございます。

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

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

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

みなさんからのアドバイスで一歩前進できました。
ありがとうございます。
103 Name: 97 [sage] Date: 2007/06/15(金) 21:57:45 ID: /Xj5L+Cq0 Be:
>>102
何はともあれ動いて良かったですね。

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

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

それと、ご存じかもしれませんが、
Xcodeのソースで、メソッドやクラス等を
オプション+ダブルクリック、コマンド+ダブルクリックすると
役に立ちますよ。
例えば、NSAppをオプション+ダブルクリックしてみてください。
104 Name: 名称未設定 [sage] Date: 2007/06/15(金) 23:34:53 ID: cvg4tVdc0 Be:
おお、横やりだがオプション+ダブルクリックは知らなかった。
これも便利だな。
105 Name: 名称未設定 [sage] Date: 2007/06/16(土) 07:38:36 ID: rwxtbdkR0 Be:
65です
>>103さん
>- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
> return [[self managedObjectContext] undoManager];
>}
>をWindowControllerに追加しないといけません。
メニューの編集->取り消し、やり直しがディスエーブルされていましたが、
このコードを加えたらイネーブルになりました。
なんでこうなったのか仕組みがわかってないので調べてみます。

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

アドバイスありがとうございます。
106 Name: 名称未設定 [sage] Date: 2007/06/17(日) 16:35:07 ID: xFWdidLR0 Be:
他のアプリから作成したXMLファイルを自分のテーブルにインポートしたいのですが、
なにをどうすればよいのかさっぱりです。
どこか良いサイト、本などがありましたらお願いします。
107 Name: 名称未設定 [sage] Date: 2007/06/17(日) 18:17:50 ID: 9BssyYOD0 Be:
そのXMLファイルってのはplist形式なの?
だとしたら,NSDictionaryのdictionaryWithContentsOfFile:で読み込んでいじくればいいんじゃない?

というか,テーブルが何をさすのかがわからない.
108 Name: 名称未設定 [sage] Date: 2007/06/17(日) 18:51:44 ID: MIixfL/i0 Be:
mkinoたんの本にXMLの説明あったよ
109 Name: 名称未設定 [sage] Date: 2007/06/17(日) 19:37:46 ID: WyfXqzgv0 Be:
つNSXMLDTD
110 Name: 名称未設定 [sage] Date: 2007/06/18(月) 12:49:40 ID: FnK6EgKv0 Be:
配列の要素値を参照する方法がわかりません。
他の言語みたいにarray[i]ではないのですか?
ネットでどこにも引っ掛からないのが不思議です。

あと配列の内容をテーブルビューに表示させるまでの方法も
さっぱりです。
111 Name: 名称未設定 [sage] Date: 2007/06/18(月) 12:55:48 ID: bgV1qYg60 Be:
初学者向けの本を最初から最後まで読め。
112 Name: 名称未設定 [sage] Date: 2007/06/18(月) 13:06:28 ID: XFI7IqHh0 Be:
>>110
配列の要素値を参照は普通にarray[i]でできない?
ひょっとして配列ってNSArrayの事じゃないよね。

テーブルビューについてはNSTableViewで検索してみなよ。
ま、DataSourceかNSArrayControllerを使えってことだよ。
113 Name: 名称未設定 [sage] Date: 2007/06/18(月) 22:16:32 ID: f97Z48MF0 Be:
>>110
俺は、お前さんがどうやって配列を宣言できたのかの方がさっぱりわかりません。
114 Name: 名称未設定 [sage] Date: 2007/06/19(火) 00:44:29 ID: dgDst+1p0 Be:
>>111-113
レスありがとうございます。配列は解決しました。
非常に単純なミスで要素値をログに吐く時に%dでフォーマットしてたので
変な数字しか出てこず、おかしいなあと悩んでいました。

>>112
NSTableView、DataSource、NSArrayControllerはなんとなくわかって定義しているのですが、
何をどうつなげていいのやら勉強中です。
115 Name: 名称未設定 [sage] Date: 2007/06/19(火) 23:11:33 ID: 8mzcE2x00 Be:
>>114
Bindingとか考えずに、基本的なやり方。

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

・そのままRun。すると「データソースとして振る舞うべきインスタンスに、
 以下のメソッドが定義されてないから、このテーブルは使えん」的な
 エラーがログに吐き出される。そこに挙げられたメソッドを自分で記述する。
 TableViewなら最低2つ。OutlineViewなら4つかな。
116 Name: 名称未設定 [sage] Date: 2007/06/19(火) 23:26:15 ID: 44NwgBsm0 Be:
一応定番サイトを貼っておく
http://hmdt.jp/cocoaProg/AppKit/NSTableView/NSTableView.html#section00
117 Name: 名称未設定 [sage] Date: 2007/06/19(火) 23:45:48 ID: 5FjzRd/E0 Be:
確かにバインディングって便利だけど、どんどん機能拡張していくと
途中から余計に面倒になって思考が停止していく...orz
118 Name: 名称未設定 [sage] Date: 2007/06/20(水) 00:15:31 ID: 8LhrRklA0 Be:
バインディング対応と非対応の差が激しくて、バインディング対応ばっかりで作るとどこかで見たアプリばっかりに成る罠。
変わったことをやろうとすると、バインディングで動くようにするのはかなり面倒。
119 Name: 名称未設定 [sage] Date: 2007/06/20(水) 00:31:22 ID: Fh609W9/0 Be:
だからIBで完結するような処理なんかそんなもんだろ。
なんかコード書かなくてもアプリができるみたいな幻想にとらわれてない?
120 Name: 名称未設定 [sage] Date: 2007/06/20(水) 13:51:36 ID: NBL8VQHj0 Be:
>>119
ない
121 Name: 名称未設定 [sage] Date: 2007/06/20(水) 13:58:11 ID: zIQZO1vl0 Be:
今のIBは Binding が目で確認できないのが痛いです。
情報表示して Binding タブを選んでさらに各グループを開いて、、、
遠すぎだよ。
122 Name: 名称未設定 [sage] Date: 2007/06/20(水) 14:03:15 ID: qldLJWyJ0 Be:
>>119
思い切りとらわれてた。
あっちとこっちを繋げてハイ出来上がり!って。
でも、結局はIBで簡単にUI作って細かい事はコードでってことになる。
123 Name: 名称未設定 [sage] Date: 2007/06/20(水) 21:59:07 ID: Dj3TYUsU0 Be:
>>121
instancesタブのツリー表示のほうで、アウトレットの接続と同じように見えるよ。
見やすいかっていうと微妙だが。
124 Name: 121 [sage] Date: 2007/06/20(水) 22:14:45 ID: P4Zq1w7a0 Be:
>>123
ほんまや!
微妙やけど無いよりましやな。
おおきに!
125 Name: 名称未設定 [sage] Date: 2007/06/20(水) 22:39:01 ID: tciIHlVd0 Be:
バインディングやCoreDataって微妙な仕様が多いよねー
KVCを多用させるのも、いつまでたってもプロトタイプって感じがしてなんだかなー
126 Name: 名称未設定 [sage] Date: 2007/06/21(木) 00:31:41 ID: 1kp6zXNr0 Be:
KVCとプロトタイピングって関係ない。
127 Name: 名称未設定 [sage] Date: 2007/06/21(木) 01:05:19 ID: +f5dJFAD0 Be:
>>115 >>116
ありがとうございます。なんとかできました。
csvファイルからインポートしてテーブルビューに表示させることができたのですが、
インポートするたびにエンティティにレコードが追加されていってしまいます。

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

ご存知でしたらお願いします。
128 Name: 名称未設定 [sage] Date: 2007/06/21(木) 12:25:54 ID: tIJB3hhC0 Be:
>>127
一件づつ deleteObject で削除するのでなく、一度に全件削除したいということ?
なら removeAllObjects で一気に削除できるけど。
NSArrayController 使ってるなら [[_arrayController content] removeAllObjects] で消えたはず。
129 Name: 名称未設定 [sage] Date: 2007/06/22(金) 19:40:14 ID: M8f2QNll0 Be:
すいません、くだらない質問ですいません。
Quartz Composer.webplugin
って、コレ、標準で組込まれているんですか?
標準で組込まれているとしたら、
どのバージョンから入っているんですか?
130 Name: 名称未設定 [sage] Date: 2007/06/23(土) 17:43:44 ID: ANfoSVtM0 Be:
スボットライト検索欄で、例えばスペース区切りでOR検索が
出来るようにするのは難しいんですかね?
131 Name: 名称未設定 [sage] Date: 2007/06/23(土) 17:48:27 ID: KW8qTWkE0 Be:
>>130
Jobs|Gates : Jobs または Gates
Jobs(!Gates) : JobsかつGates以外
Jobs(Gates|Linus) : JobsかつGates、またはJobsかつLinus
132 Name: 名称未設定 [sage] Date: 2007/06/23(土) 21:06:01 ID: QUWKqEkv0 Be:
すみません。テーブルビューののカラム表示でSQLの外部結合みたく、
別エンティティから同一キー(1対1の関係)のカラムを表示させるには、
テーブルカラムのバインディング設定だけでは難しいのでしょうか?
133 Name: 名称未設定 [sage] Date: 2007/06/23(土) 21:11:04 ID: JrUKG2eE0 Be:
日本語でおk
134 Name: 名称未設定 [sage] Date: 2007/06/24(日) 15:08:55 ID: 7icx36z80 Be:
>>128
ありがとうございます。出来ました。

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

例えばテーブルビューで「名前が"鈴木"かつ、年齢が"30"」といった
アンド検索が出来るようにしたいのですが、NSSearchFieldに
「鈴木 30」といったように入力して検索出来ればなあと。
135 Name: 名称未設定 [sage] Date: 2007/06/24(日) 16:35:48 ID: sW58ZoIj0 Be:
そういうことが出来るようにするのがプログラミングじゃないのか。
136 Name: 名称未設定 [sage] Date: 2007/06/24(日) 21:23:09 ID: oj7fKo9L0 Be:
>>134
NSSearchField自体は検索機能を持ってないから,
結局その部分を自分で実装すればいいだけの話.
137 Name: 名称未設定 [sage] Date: 2007/07/01(日) 00:21:27 ID: 5L+q9KzS0 Be:
そうそう、バインディング使わずに、基本的なウィンドウだけIBで作ってあとはコントローラ側から弄った方が速いしいろいろ出来る。

実用的なものを作ろうとすると、自分で実装しないと使えないのが多いよな。
マクが好きって幻想だけでがんばるのは辛い。orz
人海戦術も出来て儲けも桁違いに稼げるウィンドウズの方が全然魅力的だったり。orz
138 Name: 名称未設定 [sage] Date: 2007/07/01(日) 00:50:57 ID: EwoNhQlG0 Be:
C++勉強するのが面倒だからObjective-Cが好きな俺は趣味PG
139 Name: 名称未設定 [sage] Date: 2007/07/01(日) 21:33:09 ID: xbcqJltA0 Be:
テーブルビューなどでマウスホイールやクリックなどのイベントを拾うには
どうすれば良いのでしょうか?

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

非常に厨というか根本的な質問ですみません。
140 Name: 名称未設定 [sage] Date: 2007/07/01(日) 21:43:18 ID: U0TJz2SZ0 Be:
>>139

・InterfaceBuilderで、NSTableViewのサブクラスMyTableViewを作る。
・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
・MyTableViewのファイルを書き出して、その@implementation内で
 - (void)mouseDown:(NSEvent*)eventなんかを上書きする。
141 Name: 名称未設定 [sage] Date: 2007/07/02(月) 01:31:45 ID: /cUmymHP0 Be:
>>140
ありがとうございます。なんとなくわかってやってみたのですが、

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

IBOutlet MyTableView *fooTableView;
に変更して、

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

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

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




142 Name: 名称未設定 [sage] Date: 2007/07/02(月) 01:47:44 ID: qDAYMWUG0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/07/02(月) 12:13:39 ID: qJAV3pLe0 Be:
最近、テーブルビューがらみの厨な質問を乱発してるのって、同じ人?
144 Name: 名称未設定 [sage] Date: 2007/07/02(月) 13:17:36 ID: 5wPz1kBF0 Be:
そうです。
すみません。
145 Name: 名称未設定 [sage] Date: 2007/07/02(月) 16:11:36 ID: Ne8YEXNf0 Be:
ヒレガス本くらい読んどけよ。
146 Name: 名称未設定 [sage] Date: 2007/07/07(土) 19:07:56 ID: odX4zdaf0 Be:
NSMutableDictionary があって、中身のキーを一つずつチェックして、キーがある条件を
満たしたら対応するオブジェクトを処理する、ということをしたいのですが、

これ、 -keyEnumerator を使ってやるのはよくないみたいですね。
(enumerate している間に dictionary の構造が変わるとまずいからでしょうが)
でもバリューのオブジェクトの値を変更するぐらいは許してほしいような。
どうやるのが正解(?)なんでしょう。
147 Name: 97 [sage] Date: 2007/07/07(土) 20:46:14 ID: hFhQDWhy0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/07/08(日) 00:08:08 ID: RHnYtpKj0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/07/09(月) 00:06:39 ID: MKmnIjZg0 Be:
長時間費やしたのですが解決しなかったので質問させてもらいます。
ウィンドウ上に置いたボタンはsetKeyEquivalentで設定したキーで動作できるのですが、
ボタン上にaddSubviewして置いたボタンはsetKeyEquivalentをしてもキーで動作しません。
レスポンダチェイン周りを調べて自分なりに試行錯誤してみましたが解決しませんでした。
どうすれば動作するでしょうか?よろしくお願いします。
150 Name: 149 [sage] Date: 2007/07/09(月) 06:57:44 ID: MKmnIjZg0 Be:
NSResponderを継承しているviewたちをウィンドウに配置してキーを押せば
performKeyEquivalentに入って来ます。上書きしてNSLogで確かめてみました。
しかしNSButtonにaddSubviewしたviewだと反応しないです。
acceptFirstResponderをYESで上書きしたりmakeFirstResponderを試しましたがダメでした。
けどなぜかNSSliderにaddSubviewした場合は反応しました。
まだ謎が解けません、、、お力添えをお願いします。
151 Name: 名称未設定 [sage] Date: 2007/07/09(月) 12:24:49 ID: MtZ2kM7T0 Be:
NSButton が performKeyEquivalent を拾っているから、subview にはいかないということではなくて?
152 Name: 149 [sage] Date: 2007/07/09(月) 15:51:27 ID: 6JIdbr8F0 Be:
キーを押すと警告音がなるのでNSButtonはperformKeyEquivalentを拾っていないようです。
ためしにボタンのサブクラスでperformKeyEquivalentをreturn NOで上書きしてみましたが、
ボタン上のviewに処理が回ってこないという状態です。
153 Name: 名称未設定 [] Date: 2007/07/09(月) 17:37:28 ID: uzTm6K720 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/07/09(月) 17:41:11 ID: 2FPmw6nT0 Be:
そもそも、ボタンの中にボタンを配置するって
おかしいと思わんのか
155 Name: 名称未設定 [sage] Date: 2007/07/09(月) 17:57:18 ID: MZpOL97p0 Be:
>>154
みんな分かってるけど、それに突っ込むとどうなるかも知ってるからじゃね?
156 Name: 名称未設定 [] Date: 2007/07/09(月) 18:03:05 ID: uzTm6K720 Be:
>>154
いや、それはそれで面白いインターフェースかもと思って試してた
157 Name: 146 [sage] Date: 2007/07/09(月) 18:25:05 ID: LonmC7zt0 Be:
>>147 >>148
どうもありがとうございます。ちゃんとドキュメントを探すべきでした。
自分の場合値を変更するので >>148 のやり方になるんでしょうね。
158 Name: 149 [sage] Date: 2007/07/09(月) 21:47:15 ID: HHAS6qp/0 Be:
NSButtonの上にボタンを、と例を挙げましたが実際にはボタンやビューということでした。
http://www.pinkapple.tv/uploads/general20070709213058.jpg
左は通常時で右がdrawRectを上書きしたビューをボタン上に配置したものです。
この状態でボタンもビューも独自にperformKeyEquivalentを動作させたかったのです。
(ビューにテキストを表示したり、ビューが他の色、他の機能のものに置き換わったりするので
ボタンの見かけを変えるだけではダメなのです)
ウィンドウ上でなくてボタン上に配置したかったのは、ボタンとビューとでいろいろとデータのやり取りをするのでsuperViewとsubViewの関係にした方が処理が楽だったからです。
ということで>>153さんの方法を試してみます。ありがとうございます。
159 Name: 149 [sage] Date: 2007/07/10(火) 05:34:16 ID: TgqP272E0 Be:
>>153さんの方法でできました。
いろいろ調べるとperformKeyEquivalentメソッドはNSResponder、NSView、NSButtonで記述、上書きされていて、NSViewのperformKeyEquivalentは自分のsubviewに処理を送る機能があるようです。
なおかつsubviewへのperformKeyEquivalentが誰も反応しなければNOが返ってきてview自身の処理を行います。
>>153さんのはまさにそれらの機能をコードで記述したものになってます。ありがとうございました。
160 Name: 名称未設定 [sage] Date: 2007/07/11(水) 02:27:35 ID: q/pS70mE0 Be:
いつもお世話になってます。

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

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

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

としているだけなのですが、どなたか原因をご存知でしたら教えてください。
161 Name: 名称未設定 [sage] Date: 2007/07/11(水) 05:48:22 ID: 4RHpXxKf0 Be:
上のコードをコピペしてやってみましたが、おっしゃる現象は起きませんでした。
何かmyViewかmyDrawerに追加してる機能が邪魔してるのではないでしょうかね。
162 Name: 160 [sage] Date: 2007/07/12(木) 01:10:46 ID: Mzn5q1ga0 Be:
>>161

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

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

としています。これがいけないのでしょうか?
163 Name: 名称未設定 [sage] Date: 2007/07/12(木) 04:01:55 ID: DjNHr2pC0 Be:
>>162
問題の切り分けくらい自分でやりなよ。
そこまで面倒みきれない。
164 Name: 名称未設定 [sage] Date: 2007/07/12(木) 04:02:28 ID: byx4vDAn0 Be:
>>162
ちょっとやってみましたがnotificationがうまくとれなかったので;確認できませんでした。
申し訳ない。
165 Name: 名称未設定 [sage] Date: 2007/07/12(木) 09:45:28 ID: 0PLO2dIL0 Be:
>>162
これがいけないのでしょうかってそこをコメントアウトすれば、いけないかどうかくらいすぐわかるだろうが
他人にいちいち確認のコードを書かせる気か?
166 Name: 164 [sage] Date: 2007/07/12(木) 22:05:35 ID: pjCoXtAi0 Be:
興味本位でやってみたんだけど、間違った行動だったと反省してます。
まぁ答え出てないから意味ないけど。
167 Name: 名称未設定 [sage] Date: 2007/07/12(木) 23:06:17 ID: N2Qo+TtK0 Be:
Cocoa Bindingで質問です。
テキストフィールドの更新がBindingで行われるように組んだときに、
モデルの属性がごく短時間に何度も更新された場合、アプリがしばらく
固まってしまうのですけれども、これを解決するのに皆さんならどの
ような手法をとりますか?

>ttp://blog.so-net.ne.jp/MyCometG3/2007-07-12-1
168 Name: 名称未設定 [sage] Date: 2007/07/15(日) 03:38:01 ID: bqGSj8YO0 Be:
>>141
IB上でNSTableViewをダブルクリックして、
InspectorウィンドウのCustom Classde
MyTableViewに設定する。
シングルクリックだとNSScrollViewがフォーカスされるので注意。
169 Name: 名称未設定 [sage] Date: 2007/07/15(日) 03:38:59 ID: bqGSj8YO0 Be:
すげー亀レスorz
170 Name: 名称未設定 [sage] Date: 2007/07/15(日) 15:09:30 ID: iC/f5XUF0 Be:
NSPredicateで文字列「book」でフェッチしたあとに
「bookmark」など前回の文字列に付加した形の文字列で
フェッチするとひっかかりません。

毎回nilでクリアするしなかいのでしょうか?
171 Name: 名称未設定 [sage] Date: 2007/07/16(月) 07:20:46 ID: qlrw2Rv40 Be:
やっぱり凝った事をやろうとすると手間だよな。orz
まあマクだからって簡単にプログラム作れる訳は無いのだが。
172 Name: 名称未設定 [sage] Date: 2007/07/18(水) 01:22:09 ID: BRL0N5ZO0 Be:
すみません。基本の基本なのかもしれないのですが…

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 Name: 名称未設定 [sage] Date: 2007/07/18(水) 02:11:57 ID: /hOqb68d0 Be:
>>172
どっか別のところでインスタンス化した object01 を
object02 から参照できる変数に保持しておけば済む話だろう。
object02 のインスタンス変数として保持するか
あるいはグローバル変数として保持するか
その方法は時々によって違うだろうが。
174 Name: 名称未設定 [sage] Date: 2007/07/18(水) 02:45:39 ID: 3sY2PtI30 Be:
便乗して質問しますが、
.hファイルの中で
@interface MyButton : NSButton
{
NSString *myParameter;
}
と宣言するのと、.mファイルの中で
@implementation MyButton
NSString *myParameter;
と宣言するのはどう変わってくるのでしょう?
175 Name: 名称未設定 [sage] Date: 2007/07/18(水) 03:58:40 ID: ubS40ed30 Be:
前者はMyButtonのインスタンス変数で、後者は単なるグローバル変数
176 Name: 名称未設定 [sage] Date: 2007/07/18(水) 04:45:10 ID: 3sY2PtI30 Be:
どちらの場合も
-(NSString *)getString{
return myParameter;
}
みたいな感じで外部から取得したり、考えずに使えているので使い分けが分からないんです。
インスタンス変数とグローバル変数ググってきます。
177 Name: 名称未設定 [sage] Date: 2007/07/18(水) 10:03:54 ID: 8GU8wJyL0 Be:
>>176
ごく簡単に説明するとインスタンス変数は使っていいけどグローバル変数は使っちゃダメ
178 Name: 名称未設定 [sage] Date: 2007/07/18(水) 10:06:43 ID: 3sY2PtI30 Be:
>>177
分かりました。
そのインスタンスに持たせたいパラメータはちゃんと.hファイルに記述してインスタンス変数にします。
ありがとうございます。
179 Name: 名称未設定 [sage] Date: 2007/07/18(水) 11:17:24 ID: Avgak43d0 Be:
「何のために」共通のインスタンスが必要なのかがわかれば、助言の一つも出せるのだが。
180 Name: 名称未設定 [sage] Date: 2007/07/18(水) 14:01:53 ID: 3sY2PtI30 Be:
>>179
例えば、.mファイルの中で

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

という感じだとどうでしょう?
例えなのでmethod自体がBOOLをとるように書き直すというのは無しで。
普段パラメータは.hファイルの中に書いてるんですが、上の方で質問させていただいたように
使い分け、というかグローバル変数が好ましくない理由、状況がまだ今ひとつ掴めてません。。
181 Name: 名称未設定 [sage] Date: 2007/07/18(水) 14:26:05 ID: Avgak43d0 Be:
根本的な部分が分かってないのか。
とりあえず、
BOOL bool;
は原則禁止!
static BOOL bool;
で。(もちろん例外はあるが今は考えなくていい)

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

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


通常クラス定義ファイルに宣言定義された静的大域変数はクラス変数と呼ばれる。
クラス変数はすべてのインスタンスに共有されるため、その変更はすべてのインスタンスに影響を与える。
インスタンス変数はインスタンスごとに別のものとなるため、変更はインスタンスの中にとどまり他のインスタンスに影響を与えない。
182 Name: 名称未設定 [sage] Date: 2007/07/18(水) 20:19:29 ID: 3sY2PtI30 Be:
なるほど、凄く分かりました!試しに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 Name: 名称未設定 [sage] Date: 2007/07/18(水) 21:03:40 ID: 3sY2PtI30 Be:
↑全ボタンのパラメータ、の間違いでした。
staticはよそから干渉されないように局所的な変数にする、staticをつけないと外部変数と理解しました。
試しに上記のコードからのstaticを外し、まったく同じコードの別のNSButtonのサブクラスを作ってみたら
ちゃんとパラメータが共有されました。凄く勉強になりました。ありがとうございました。
184 Name: 名称未設定 [sage] Date: 2007/07/19(木) 02:06:33 ID: a3+jGlIB0 Be:
ちなみに,そのstaticを付けた変数を「クラス変数」という.
185 Name: 名称未設定 [sage] Date: 2007/07/19(木) 03:06:04 ID: U9xJQ7gH0 Be:
Objective-C にはクラス変数なんてありません。
186 Name: 名称未設定 [sage] Date: 2007/07/19(木) 10:05:30 ID: gCGzQvIn0 Be:
クラスオブジェクトが持つ変数はクラス変数じゃないのか?
187 Name: 名称未設定 [sage] Date: 2007/07/19(木) 10:16:57 ID: A6zlNdun0 Be:
どんな教科書(資料)で勉強したの?

http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_4.html#TPXREF118

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

... 一部のクラスは、静的な変数を宣言し、それらを管理するクラスメソッドを提供します
(クラス定義と同じファイルで static 変数を宣言すると、その有効範囲は当該クラスのみ、厳密には当該ファイルに実装されたクラスの部分に限定されます。
インスタンス変数と異なり、サブクラスは静的な変数を継承できません)。
188 Name: 名称未設定 [sage] Date: 2007/07/22(日) 10:56:58 ID: rhiDTEck0 Be:
BOOL isNibLoaded = [NSBundle loadNibNamed: nibFileName owner: self];

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

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

[NSBundle loadNibNamed: nibFileName owner: self]
が失敗するのは、どういうケースが考えられるでしょうか。
189 Name: 名称未設定 [sage] Date: 2007/07/22(日) 11:14:20 ID: /m9PDaPq0 Be:
>>188
>nibFileName には、正しく値が設定されているのですが、
>nib が読み込まれていれば、表示されるはずのウインドウが
>表示されません。

本当に正しく値が設定されているという自信はあるのか?
190 Name: 188 [sage] Date: 2007/07/22(日) 11:45:38 ID: rhiDTEck0 Be:
>>189
あります。

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

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

でもそれを確かめる方法や、nib(特にバインディングの設定)の良い
デバッグ方法がわかりません。
191 Name: 名称未設定 [sage] Date: 2007/07/22(日) 16:02:33 ID: aRES5gfc0 Be:
awakeFromNib が loadNibNamed:owner: 呼び出し中に呼ばれるから、何か実装してるなら
それを一度コメントアウトしてみる。

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

とかやってみるのはどうでしょう。
192 Name: 名称未設定 [sage] Date: 2007/07/22(日) 17:11:47 ID: 1Do/ZYGN0 Be:
その前にデバッガコンソールの存在に気づいているかが気になる。
193 Name: 名称未設定 [sage] Date: 2007/07/22(日) 17:24:50 ID: rLqo+Xbu0 Be:
nib によって読み込まれるインスタンスの awakeFromNib 内に loadNibNamed: あると
無限ループになる
194 Name: 188 [sage] Date: 2007/07/22(日) 17:58:58 ID: rhiDTEck0 Be:
>>191-193
ありがとうございます。

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

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


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

今回のバグの場合、awakeFromNib の1行目に置いた
ブレークポイントにも到達しませんでした。
195 Name: 名称未設定 [sage] Date: 2007/07/22(日) 18:33:07 ID: VUxjnHCb0 Be:
>>194
>バインディングのデバッグ
バインディングはあんまりやってないけど、consoleメッセージとexceptionはいているなら
gdb> break -[NSException raise]
でなんとかなってる。
196 Name: 名称未設定 [sage] Date: 2007/07/22(日) 22:26:11 ID: gT1REgB20 Be:
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 Name: つづき [sage] Date: 2007/07/22(日) 22:27:21 ID: gT1REgB20 Be:
- (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 Name: 名無しさん@そうだ選挙に行こう [sage] Date: 2007/07/29(日) 09:08:45 ID: ++cxbJD10 Be:
NSSliderからのアクションを
- (IBAction)myAction:(id)sender{
NSLog(@"action");
}
と受けると、スライダーのmouseDown、mouseDrag、mouseUpのタイミングでアクションが送られてくるようなのですが、
これを、この受け手側のmyAction内で分類できないでしょうか?
スライダーのサブクラスを作らなくてもこれらが分類できればいいなと思いまして。
御教授願います。
199 Name: 198 [sage] Date: 2007/07/29(日) 11:23:33 ID: ++cxbJD10 Be:
自己解決
- (IBAction)myAction:(id)sender{
NSEvent *event = [[NSApplication sharedApplication] currentEvent];
if ([event type] == NSLeftMouseDown) {}
if ([event type] == NSLeftMouseUp) {}
}
のようにすればマウスの動作を分類できました。
しかしこの方法だとなぜか、重いQuickTimeMovieを動かしている時に
mouseUpの方を取りこぼしてしまうので、やっぱりスライダーのサブクラスを書いてみようと思います。
200 Name: 名称未設定 [sage] Date: 2007/08/02(木) 07:44:39 ID: coNJlctT0 Be:
う~
NSMailDelivery でケータイに日本語メール送ると文字化けしちゃう。

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

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

deliverMessage:headers:format:protocol:
ならどうかと、ヘッダをセットして送信してみましたが、
Content-Type: は置き換わらないようです。
201 Name: 名称未設定 [sage] Date: 2007/08/03(金) 03:55:22 ID: LeRHiyYZ0 Be:
>>200
関係ないかもしれないけど、Mail.app は言語環境を英語にして起動すると UTF-8 で送信される
202 Name: 200 [sage] Date: 2007/08/03(金) 06:14:19 ID: 9xPJ2l+O0 Be:
>>201
はい、言語環境が関係ありそうですが、日本語なんですよねえ。

しょうがないのでAppleScriptでMail.appつついて送信したら、
ISO-2022-JP で送れましたので、とりあえずこれで良しとします。
203 Name: 名称未設定 [sage] Date: 2007/08/03(金) 10:34:05 ID: mJ4qs93D0 Be:
>>202

言語設定以外に、そのアプリが日本語にローカライズされててもダメ?
204 Name: 200 [sage] Date: 2007/08/03(金) 17:13:45 ID: 9xPJ2l+O0 Be:
>>203
はい、ローカライズしてます。
Localizable.strings(Japanese) から文字取れてますし、
Info.plist の CFBundleDevelopmentRegion を Japanese にしても一緒でした。
他に触るとこなかったかな?
205 Name: 名称未設定 [sage] Date: 2007/08/03(金) 18:39:40 ID: RMVio4XF0 Be:
mail.appの文字コード自動判定がEudoraに比べて手厳しく
機種依存文字が含まれていると、
Content-Type: text/plain; charset=US-ASCII; format=flowed
Content-Transfer-Encoding: base64
になり、相当苦しみました。

素人なんで文字コードまでお勉強できてないのですが。。。
206 Name: 名称未設定 [sage] Date: 2007/08/03(金) 22:49:36 ID: zBWSwrqo0 Be:
しかし NSMailDelivery ってどのぐらい Mail.app と連携してるんだろ。
なんとなく、単独で使えるようにはあまりメンテされてない感が...

しかし、今日び複数アカウントがあり、それぞれメールの送受信法が違うし、
メールの中身もいろんなものがあり、たかがメールを送るのも大変だよな。
207 Name: 名称未設定 [sage] Date: 2007/08/04(土) 00:06:43 ID: N6Lu9KO20 Be:
NSMailDeliveryはAPIを見る限り、
貧弱すぎてMail.appでバリバリ使っているとは思えないよね。
NSMailDeliveryってヘッダ見ると1997のままだけど10年放置なの?
JavaMailレベルとは行かないまでも、もっと拡張してほしい。
208 Name: 名称未設定 [sage] Date: 2007/08/04(土) 09:56:01 ID: zNZwO1rZ0 Be:
Cocoa Bindings で NSTextField に文字を表示させてるのですが、
表示させる文字を setValue: forKey: で更新すると、それまで表示していた文字と、
新しい文字とが重なって表示されてしまいます。

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

バインディングの設定のせいなのか、コードに誤りがあるのかもわかっていません。
上書きされたはずの文字「十」は、誰が保持しているのでしょうか。
209 Name: 名称未設定 [sage] Date: 2007/08/04(土) 11:30:03 ID: I4XWeUY/0 Be:
>>208
>新しい文字とが重なって表示
ウインドウリサイズ等して再描写しても?
Application delegateにKVを持たせ、NSButton>appDelegate action内でsetValue:forKey:してみたけど意図通りになった。
210 Name: 208 [sage] Date: 2007/08/04(土) 12:00:03 ID: zNZwO1rZ0 Be:
>>209
ありがとうございます、再描画したらきちんと表示されました。
再描画せずにきちんと表示するには、何が足りないでしょうか。
211 Name: 208 [sage] Date: 2007/08/04(土) 12:01:03 ID: zNZwO1rZ0 Be:
>>再描画せずに

すみません。
リサイズなどをしなくても再描画するには、何が足りないでしょうか。
212 Name: 名称未設定 [sage] Date: 2007/08/04(土) 12:51:34 ID: I4XWeUY/0 Be:
>>211
setter(内で値の加工をしている?内で他のオブジェクトにsetしている?)やKVOを見直したほうが
いいと思うけど、再描写は
[nsview setNeedsDisplay: (BOOL)]
か(他のスレッドからなら)
[nsview display] または、[[nsview superview] display]
213 Name: 208 [sage] Date: 2007/08/04(土) 14:16:03 ID: zNZwO1rZ0 Be:
>>212
setter は、

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

となっています。
view に対して再描画させるとなると、
バインディングを使っている意味が薄れるので、
自分としても KVC/KVO で対処したいのですが‥。
214 Name: 名称未設定 [sage] Date: 2007/08/04(土) 15:32:11 ID: I4XWeUY/0 Be:
NSValueTransformerサブクラスで(NSString*)valueを100回リピートする。"十"→"十十十…"
action内、setValue:forKey: を呼び出す所を1000回実行ってやってみたけど、重くなるだけで乱れは起きない。
負荷と思ったんだけど違ったか。(G4 single)
ttp://www.vipper.org/vip576764.png.html

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

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

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


+ (BOOL)accessInstanceVariablesDirectly を使っている?いない?
215 Name: 名称未設定 [sage] Date: 2007/08/09(木) 20:05:40 ID: rPPfUlyN0 Be:
NSViewの上にNSImageを並べて表示させたいのですが、さっぱりです。
216 Name: 名称未設定 [] Date: 2007/08/09(木) 21:10:54 ID: tas9QJXw0 Be:
Cocoa使ってるとよくCarbonのAPIを呼び出さなければならないことがありますけど、
いっそ入門Carbonとか読んでみた方がいいですかね
217 Name: 名称未設定 [sage] Date: 2007/08/09(木) 22:55:25 ID: msAuLRcc0 Be:
>>214
ってゆうかそれだって例えば他のスレッドが [obj setName:]をほぼ同時に呼んだら
アウトだろ。
218 Name: 名称未設定 [sage] Date: 2007/08/09(木) 23:31:14 ID: nEMt5Ylz0 Be:
>>214
NSMatrixでNSImageCellを使うのが手っ取り早い.
219 Name: 名称未設定 [sage] Date: 2007/08/10(金) 00:10:34 ID: NXu0UGJP0 Be:
ループ内で座標にイメージのサイズを足せばいいだけじゃん
220 Name: 名称未設定 [sage] Date: 2007/08/10(金) 21:20:23 ID: B2bpt6bp0 Be:
>>218 >>219
ありがとうございます。
NSMatrixで行列表示ができました。
でもなぜか、セルがウィンドウの上に切れて表示されるのと
putCell:atRow:column:でNSImageCellで画像をセットしても
同じ画像ばっかり表示されるんです。

もう少し勉強してみます。
221 Name: 名称未設定 [sage] Date: 2007/08/10(金) 23:22:04 ID: NXu0UGJP0 Be:
>>220
NSMatrixにaddRow/addColumnして、[self cellAtRow:y column:x]に対してイメージをセットしたらどうかな
222 Name: 名称未設定 [sage] Date: 2007/08/10(金) 23:23:05 ID: NXu0UGJP0 Be:
selfはNSMatrixね
223 Name: 214 [sage] Date: 2007/08/11(土) 01:19:20 ID: 4MGmk/Il0 Be:
なんかちぐはぐなレスになった>>214はあぼーんで。スレ汚しスマソ
>>217 指摘thx.
224 Name: 名称未設定 [sage] Date: 2007/08/11(土) 01:27:56 ID: uNrauIzq0 Be:
220です。
自己解決できました。
NSScrollView内にNSMatrix作ったら左上から右下に向かって綺麗に並びました。
重複画像は単純にNSImageのalloc/releaseの記述ミスでした。

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

次は画像の影付けにチャレンジ。
これまた難易度が高そうです(^^;
NSImageにaddShadowとかあったら楽なのになあ。
225 Name: 名称未設定 [sage] Date: 2007/08/13(月) 19:32:35 ID: HjQoWJR20 Be:
NSSegmentedControlをクリックした時、デフォルトだとマウスアップ時に選択が移行するのですが、
これをマウスダウン時のタイミングで選択を変えるにはどうしたらいいでしょう?
sendActionOn: メソッドを使ってみたのですがうまくいかず
今はマウスダウンの中を書き換えようとしてるのですが、
NSTabViewのtabViewItemAtPoint メソッドのようなものがNSSegmentedControlにはなくどうしてよいものか分かりません。
御教授よろしくお願いします。
226 Name: 名称未設定 [sage] Date: 2007/08/15(水) 00:34:56 ID: eYK2hRJc0 Be:
サブクラスで

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

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

}
としてみるとか.
227 Name: 名称未設定 [sage] Date: 2007/08/15(水) 04:21:23 ID: FI0rPcR60 Be:
NSSliderなんかと同じでNSSegmentedControlにはmouseUpが実装されてないので
例えばサブクラスで
- (void)mouseUp:(NSEvent *)theEvent{
NSLog(@"MouseUp");
[super mouseUp:theEvent];
}
としてもここに処理が回ってこないんです。
なので>>226のコードだと何も処理されないんです。。
正確にはNSSegmentedControlにmouseDownは継承されてるけど
オーバーライドされて機能しないようになってるってことだと思いますけど。
228 Name: 名称未設定 [sage] Date: 2007/08/15(水) 06:42:46 ID: xHhBTOGd0 Be:
NSSegmentedCell (NSCell)の
sendActionOn あたりを変更してみるとか?
229 Name: 名称未設定 [sage] Date: 2007/08/15(水) 06:43:45 ID: xHhBTOGd0 Be:
既出だったかスマン
230 Name: 名称未設定 [sage] Date: 2007/08/15(水) 10:34:54 ID: g4ql7t+80 Be:
普通にこの辺じゃないの?
-[NSCell trackMouse:inRect:ofView:untilMouseUp:]
-[NSCell startTrackingAt:inView:]
-[NSCell continueTracking:at:inView:]
-[NSCell stopTracking:at:inView:mouseIsUp:]

かなり面倒くさいけど。
231 Name: 225,227 [sage] Date: 2007/08/15(水) 15:37:59 ID: PbdqCUHT0 Be:
ありがとうございます、とりあえず現状
-(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 Name: 名称未設定 [sage] Date: 2007/08/16(木) 17:16:23 ID: cDPUZH1x0 Be:
oomori.comってどうなったんだ?
233 Name: 名称未設定 [sage] Date: 2007/08/16(木) 17:23:26 ID: D7uzhTeg0 Be:
先日つながらなくなって、一時復活したようだけど
それからまたつながらなくなったみたい
どうしちゃったんだろうね
234 Name: 名称未設定 [sage] Date: 2007/08/16(木) 17:57:18 ID: 5J/T/ZnQ0 Be:
愛想を尽かしたんじゃないかな。
235 Name: 名称未設定 [sage] Date: 2007/08/18(土) 19:33:59 ID: b9e4iKE/0 Be:
ttp://www.haloscan.com/comments/mkino/20070810/
236 Name: 名称未設定 [sage] Date: 2007/08/18(土) 19:39:50 ID: qe4k9HGL0 Be:
cocoaで飯食ってけますか?
237 Name: 名称未設定 [sage] Date: 2007/08/18(土) 20:25:28 ID: xDpeu2aa0 Be:
Cocoaは嗜好品であって主食にはなりません。
238 Name: 名称未設定 [sage] Date: 2007/08/19(日) 00:50:40 ID: wXs7PQ2p0 Be:
>>235
面白いけど、MyCOMの記事への指摘を何故日記のコメントにするのか分からんな。
239 Name: 名称未設定 [sage] Date: 2007/08/19(日) 01:52:34 ID: wwtSg7AR0 Be:
mkimoさん?
240 Name: 名称未設定 [sage] Date: 2007/08/19(日) 06:35:14 ID: b5TCkvsd0 Be:
mkinoってエムキノって読むの?
241 Name: 名称未設定 [sage] Date: 2007/08/19(日) 08:21:45 ID: x6297PUr0 Be:
>>238
俺も思た。
しかもコメント先はツールバーアイコンに関するエントリで、
マイコミは何にも関係ないんだもんな。
メールでもなんでもすりゃいいものを、ちょっとマナー悪いように思う。
242 Name: 名称未設定 [sage] Date: 2007/08/19(日) 09:13:46 ID: fHLqYkOZ0 Be:
ダイナミックObjective-Cへの突っ込みにHMDTの最新エントリのコメント欄使う奴はけっこうよく見るだろ。
243 Name: 名称未設定 [sage] Date: 2007/08/19(日) 09:34:24 ID: x6297PUr0 Be:
>>242
そーいうもんなのかな? 俺が自分のサイトでやられたらあんまり良い気分じゃないけど。
あまりにも主題と関係のないこと書かれたら、後からそこ探すの大変だし。
ま、時々見かけるmkinoマンセー連中もウザいし、どうでもいいんだけど。
244 Name: 名称未設定 [sage] Date: 2007/08/19(日) 09:44:23 ID: etpi/Mpi0 Be:
>>239
わろた。
実物見たことないが、キモいのかw
245 Name: 名称未設定 [sage] Date: 2007/08/19(日) 11:40:02 ID: ocPOSWi+0 Be:
コメント欄で主題と異なることを書き込むのは俺もマナー違反だと思うよ。

でも、Macでプログラム系の掲示板がどこかほしいな。検索機能付きのやつ。
HMDTにあった掲示板もスパムでやられて閉鎖されちゃったし、やっぱり
運営難しいのかな。こんな感じのがあればいいのに。
>ttp://www.atmarkit.co.jp/bbs/phpBB/index.php
246 Name: 名称未設定 [sage] Date: 2007/08/19(日) 12:35:59 ID: fZdGSCkT0 Be:
質問です。
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 Name: 名称未設定 [sage] Date: 2007/08/19(日) 13:24:40 ID: L1niG0WF0 Be:
エンコードがUTF-8じゃないんですか?

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

聞く前に NSError を返してもらって調べるくらいしましょうね。
248 Name: 名称未設定 [sage] Date: 2007/08/19(日) 17:56:55 ID: fZdGSCkT0 Be:
>>247
できました。ありがとうございます。

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

精進します。
249 Name: 名称未設定 [sage] Date: 2007/08/19(日) 22:17:57 ID: GJetEexT0 Be:
>>248
NSURLRequestとかも試してみたら?
250 Name: 名称未設定 [sage] Date: 2007/08/20(月) 00:06:56 ID: sNRA//U50 Be:
>>245
PukiWikiなら設置してある。
放置気味だけど。
ttp://cocoawiki.aerial.st
251 Name: 名称未設定 [sage] Date: 2007/08/20(月) 03:27:37 ID: VX9jayCX0 Be:
NSOpenGLViewが複数あるとき,一個のViewの方でpickしたら
もう一個のViewが描画されなくなるんだけどなんでだろう。
glRenderMode(GL_SELECT);

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

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

252 Name: 名称未設定 [sage] Date: 2007/08/20(月) 09:02:13 ID: XvOlYfuG0 Be:
>243
実際あの指摘は正しいんだろか?
初心者の漏れにはサパーリわからんのだけど。
253 Name: 名称未設定 [sage] Date: 2007/08/20(月) 22:17:07 ID: t64RIRSP0 Be:
>>252
サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?


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

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

最終的に「Cocoaパターン」とでも呼べるものが出来上がったら面白いなあと思う。
し、もしかするとそんな将来の著作も狙ってたりして。
254 Name: 名称未設定 [sage] Date: 2007/08/20(月) 22:23:05 ID: t64RIRSP0 Be:
なんだ、ADCサイトに既に元ネタちっくなものがあるじゃないか...
あとはそれをどこまで膨らませて(いい意味で)書けるかだなあ。
255 Name: 名称未設定 [sage] Date: 2007/08/20(月) 22:27:39 ID: t64RIRSP0 Be:
連投すまん。>>254のことはデザパタ関連の連載の最初にすでに断ってあった。
だから本人もそれを単純に踏襲したものにならないように書いてる筈だと期待。
256 Name: 名称未設定 [sage] Date: 2007/08/20(月) 22:30:46 ID: XG0wpyE80 Be:
え?
期待してんの?
257 Name: 名称未設定 [sage] Date: 2007/08/20(月) 22:31:52 ID: m/MJ9Do70 Be:
アクセス数の多いサイトの、本来は何の関係もないページトップのエントリに対して、
わざわざ自分のサイトへのリンクを記載してコメントするのはちょっと気が引けるな。俺は。
なんか宣伝みたいになっちゃうじゃん? 「こんな鋭いツッコミする俺ってどう?」みたいな。
ある程度気心の知れた常連さんみたいだし、そういう意図はないんだろうけど。
といいつつ、話の展開は気になる。
258 Name: 名称未設定 [sage] Date: 2007/08/21(火) 07:51:32 ID: 6qziaugl0 Be:
>253
>サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?

フツーに野次馬なだけです
259 Name: 名称未設定 [] Date: 2007/08/21(火) 20:44:58 ID: 68zc4QPq0 Be:
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(…
とやってます。
ttp://developer.apple.com/jp/technotes/tn2004/tn2138.html#TNTAG15
260 Name: 名称未設定 [sage] Date: 2007/08/22(水) 11:48:33 ID: 09zetXWR0 Be:
>>259
SetMovieGWorld は CreateMovieStrage の後なんじゃね?
qtMovie が NULL の状態で SetMovieGWorld しても意味ない気がする。

Movie 作っても表示はされなくて、インスタンス化してから表示されるんじゃないか?
261 Name: 名称未設定 [259] Date: 2007/08/22(水) 13:46:57 ID: JadCL/7H0 Be:
>>260
ありがとうございます。仰る通りにCreateMovieStrage(…) の後に SetMovieGworld(…) を
やってみましたが、同じ結果でした。
で、関係する関数を調べてみたんですが、NewGWorld(…) が OSX10.4 で廃止されていました。
コンパイルエラーも実行時エラーも出てなかったので通っているものとばかり…
代わりの関数って何になるんでしょうか?
もちろん自分でも調べてみますが、ご存知でしたらお教えください。
262 Name: 名称未設定 [sage] Date: 2007/08/22(水) 14:11:21 ID: fw6+crbU0 Be:
廃止?廃止予告じゃないの?
263 Name: 名称未設定 [sage] Date: 2007/08/22(水) 21:59:05 ID: dvhT81p60 Be:
>>261
というか、関数のエラーチェックをしてないのでは?
どこで引っかかっているかはきちんと確認したか?

そのケースは普通GWorldがきちんと出来ていないか
Setではねられているかどちらかでは。
264 Name: 259 [sage] Date: 2007/08/23(木) 00:56:08 ID: xQ3xY0pg0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/08/23(木) 08:39:50 ID: MFvh7UHN0 Be:
既に解決していたらよけいなお世話だが、
ちょっと最初のソース>>259を見ていて気になったんで、、、
SetMovieGWorldで設定しているqtMovieは実際描画を行っているQTMovie
(こっちはQTKitの方ね)を指している?

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

実際の所CreateMovieStrageに対応するQTKitの関数が無いのが問題
なんだけどね、いまQuickTimeに手を出すのはカオスに手を出すよう
なものだから必要に迫られていないのならばQTKitがもう少し充実す
るまで待った方が良いような気がする。
266 Name: 名称未設定 [sage] Date: 2007/08/23(木) 09:28:42 ID: b2guyxFU0 Be:

QTKitは試していないけど

http://lists.apple.com/archives/QuickTime-API/2006/Feb/msg00239.html

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

別のMovie構造体にセットしてもそりゃだめだな。
268 Name: 259 [sage] Date: 2007/08/23(木) 11:59:41 ID: xQ3xY0pg0 Be:
>>265, 266, 267
おおおぉ、ありがとうございます!解決致しました。
quicktimeMovieFromTempFileから返って来たMovieについて、SetMovieGWorldをかけ
QTMovieを作ったら見事に消えました。厚くお礼を申し上げます。

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

何はともあれ、つきあって下さった皆様本当にありがとうございます。
269 Name: 名称未設定 [sage] Date: 2007/08/23(木) 13:14:35 ID: MFvh7UHN0 Be:
>>268
Carbonの世界はCarbonの世界で悪くないよ。Appleは終息方向に向かいたいみたい
ですけどね。

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

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

まあ、Carbonはここではすれ違いだ。失礼しました。
270 Name: 名称未設定 [sage] Date: 2007/08/23(木) 16:40:07 ID: tUB6r9Qr0 Be:
てことでObjective-C2.0のQTKitに期待なわけですね。
271 Name: 259 [sage] Date: 2007/08/23(木) 18:29:02 ID: xQ3xY0pg0 Be:
>>269, 270
なるほど、Carbon からは QuickTime が使い易いんですね。
Leopard の QTKit が使い勝手よくなっていることに期待します。
後2~3ヶ月か。うーん早く出して欲しいなぁ。
272 Name: 名称未設定 [sage] Date: 2007/08/24(金) 13:00:09 ID: plQI0uRV0 Be:
>>269

判ってると思うけど、QuickTimeはCarbonじゃ無いよ。
GWorldとは手を切って、OpenGL Contextに移行しよう。
273 Name: 259 [sage] Date: 2007/08/24(金) 17:12:35 ID: 9ylc1pF50 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/08/24(金) 18:05:34 ID: plQI0uRV0 Be:
Creating a Visual Context
http://developer.apple.com/documentation/QuickTime/RM/MovieBasics/MTOpenPlayMovies/3openplaymovies_output/chapter_1000_section_2.html

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

SetMovieGWorld => SetMovieVisualContext

CIVideoDemoGL
http://developer.apple.com/samplecode/CIVideoDemoGL/index.html


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

要はみんなテクスチャなんでGPUの中だけで相互にいじれると。
275 Name: 名称未設定 [sage] Date: 2007/08/24(金) 20:07:50 ID: jUBSvJSS0 Be:
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 Name: 名称未設定 [sage] Date: 2007/08/25(土) 01:30:41 ID: VopUGkEZ0 Be:
>>275
MyCometG3氏と見た。
277 Name: 259 [sage] Date: 2007/08/25(土) 19:15:58 ID: NJSbpzvW0 Be:
>>274,275
うーん、覚えないといけない事がいっぱいですね…一つずつ学びたいと思います。
ありがとうございました。
278 Name: 名称未設定 [sage] Date: 2007/08/28(火) 07:04:19 ID: zHr/kI630 Be:
初歩的質問で申し訳ないのですが、NSString文字列の
制御文を書きたいのですが、どのようにすればいいのでしょうか。

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

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

のように書いたのですが、if の行でエラーが出てしまいます。
279 Name: 名称未設定 [sage] Date: 2007/08/28(火) 07:09:19 ID: Xv9pLU0Y0 Be:
>>278

if (hoge isEqualToString:@"あいうえお") {
280 Name: 名称未設定 [sage] Date: 2007/08/28(火) 07:11:51 ID: lNlMIRDY0 Be:
朝からcocoa
いいね素晴らしいね
281 Name: 名称未設定 [sage] Date: 2007/08/28(火) 07:16:01 ID: zHr/kI630 Be:
>>279
分かりました。勉強不足でした。

ありがとうございます。
282 Name: 名称未設定 [sage] Date: 2007/08/28(火) 12:58:25 ID: y/omrr0P0 Be:
>>279
@""の中に日本語はまずくないですか?

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

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

}

くらいでは。
283 Name: 名称未設定 [sage] Date: 2007/08/28(火) 13:13:32 ID: rN2eIabO0 Be:
>>278
この例だと、>>278が意図したようには動かないが、エラーも出ないのでは。
284 Name: 名称未設定 [sage] Date: 2007/08/28(火) 13:28:47 ID: qboyE3Nc0 Be:
オブジェクト定数に日本語使ったからエラー出たんじゃね?
285 Name: 名称未設定 [sage] Date: 2007/08/28(火) 13:54:14 ID: p7clQF4e0 Be:
その前に条件式内での代入は不問なの?

>のように書いたのですが、if の行でエラーが出てしまいます。
どんなエラーかも分からないし。
286 Name: 名称未設定 [sage] Date: 2007/08/28(火) 15:04:49 ID: y5W8OHwo0 Be:
パールや簡易系スクリプト上がりだと苦労するよ。オブジェC。
287 Name: 名称未設定 [sage] Date: 2007/08/28(火) 15:42:39 ID: KiMzdaU00 Be:
CocoaDevCentralあたりにPHPからの移行チュートリアルみたいなのあった気がする。
英語だが。
288 Name: 名称未設定 [sage] Date: 2007/08/28(火) 15:57:17 ID: qboyE3Nc0 Be:
うそん
俺AppleScript上がりだけどすんなり理解できたよ、ObjC
289 Name: 名称未設定 [] Date: 2007/08/29(水) 03:40:32 ID: QhQnuPQW0 Be:
Cocoa初心者です。
ヒレガス本(日本語版)は、済ませました。
次にやると良い入門書があれば、ご紹介ください。
290 Name: 名称未設定 [sage] Date: 2007/08/29(水) 13:43:03 ID: 6vtaxeAX0 Be:
>>289
何を作りたいの?
291 Name: 名称未設定 [sage] Date: 2007/08/29(水) 19:40:33 ID: mCpcDP8p0 Be:
テーブルビューでコアデータにバインドしないカラムのソート方法がさっぱりです。

ソート用にそのカラムの配列を作ってソートディスクリプタをかますのですか?
292 Name: 名称未設定 [sage] Date: 2007/08/29(水) 19:50:19 ID: sxJk1+Ic0 Be:
NSTableView の - (NSArray *)sortDescriptors;
NSMutableArray の - (void)sortUsingDescriptors:(NSArray *)sortDescriptors;
がヒントというか殆ど答え。
293 Name: 名称未設定 [sage] Date: 2007/08/29(水) 20:15:26 ID: FVUVQ2w00 Be:
NSTextFieldについて質問させてください

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

[NSControl sizeToFit]だと横幅が変わってしまいます
294 Name: 名称未設定 [sage] Date: 2007/08/30(木) 01:39:01 ID: 8W/XnYIW0 Be:
>>291
ttp://blog.so-net.ne.jp/finky/2005-04-04
295 Name: 名称未設定 [sage] Date: 2007/08/30(木) 01:47:09 ID: 8W/XnYIW0 Be:
>>293
IBのインスペクタのサイズで,
NSTextFieldのサイズを上下にリサイズするように設定してみては.
上下にはバネ,左右は直線の表示に.
296 Name: 名称未設定 [sage] Date: 2007/08/30(木) 02:23:58 ID: zfQNQU460 Be:
>>294
そこに書いてあることは間違ってるとは言わんが
すごく誤解を招きそうな感じの書きっぷりになってるな
297 Name: 293 [sage] Date: 2007/08/31(金) 00:21:20 ID: coa9p3Qi0 Be:
>>295
ダメでした。IBの「Size to Fit」メニューではAutosizing設定に
合わせてくれるんですが、プログラムでは

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

としても横に長く伸びてしまいます
298 Name: 名称未設定 [sage] Date: 2007/08/31(金) 03:54:43 ID: k2mfVNs40 Be:
>>297
NSTextFieldのsetLineBreakMode:でラップするよう設定してみては?
詳しくはリファレンス参照.
299 Name: 293 [sage] Date: 2007/08/31(金) 23:09:17 ID: coa9p3Qi0 Be:
自己解決しました。これでできそうです。

NSRect fr = [textField frame];
fr.size = [[textField cell] cellSizeForBounds:[_textField bounds]];
[textField setFrame:fr];
300 Name: 名称未設定 [sage] Date: 2007/09/01(土) 17:23:27 ID: V20HLbnL0 Be:
>>292 >>294
回答ありがとうございます。
チャレンジしてみます。
301 Name: 名称未設定 [sage] Date: 2007/09/02(日) 16:01:51 ID: 1W/RX5JH0 Be:
NSTableView(NSArrayController)で最後にソートしたカラムとソート順をアプリの終了時に保持して、
次回起動時に前回の状態でソートするにはどうすればよいのでしょうか?

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

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

良い知恵がありましたらお願いします。
302 Name: 名称未設定 [sage] Date: 2007/09/02(日) 17:36:24 ID: QfZEBWjg0 Be:
自分で変数もってそれをプロパティリストに保存して起動時にソートしなおすとかは?
とNSTableView使ったことないけど言ってみる
303 Name: 名称未設定 [sage] Date: 2007/09/02(日) 23:43:35 ID: BsNs+MD5P Be:
descriptionで保存するんじゃなくて、sortDescriptorsにNSArchiver使った方がいいんじゃない?
で次回起動時にはNSUnarchiverを使って復元したものをsetSortDescriptors:して再ソート
304 Name: 名称未設定 [] Date: 2007/09/03(月) 01:24:15 ID: d9shAoB60 Be:
ass乞食がcocoaのhtmlレンダーマンを掘り当てたらしいね
305 Name: 名称未設定 [] Date: 2007/09/03(月) 01:34:14 ID: J1vhJrBi0 Be:
中国人は赤ん坊も食べる
http://www21.tok2.com/home/saigoutakamori/Chinese_culture_that_eats_baby1.htm
306 Name: 名称未設定 [sage] Date: 2007/09/07(金) 21:36:25 ID: EENbuIBN0 Be:
ああ、さっぱりわからないよ兄さん。
307 Name: 名称未設定 [sage] Date: 2007/09/11(火) 23:43:45 ID: 8nKQQObl0 Be:
NSPredicateで" カラム=='値' "というのはできるのですが、
" 関数の返り値=='1' "みたいなことは出来るのでしょうか?
よろしくお願いします。
308 Name: 名称未設定 [sage] Date: 2007/09/12(水) 20:54:55 ID: 0PGJU/k/0 Be:
またHMDT恒例の、エントリ無関係ツッコミが始まりましたな。
309 Name: 名称未設定 [sage] Date: 2007/09/12(水) 21:50:19 ID: f0yZ2CXF0 Be:
>>307


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

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

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

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

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

そこでタイプをバイナリデータにしてみたんですが、
当然、作成されたXMLの中身がバイナリになって可読性が悪くなります。
タイプをStringのままで、NSScrolViewを編集できるようにするにはどうしたらいいでしょうか。
311 Name: 名称未設定 [sage] Date: 2007/09/13(木) 10:03:32 ID: tYOZKWhg0 Be:
すいません。
ごにょごにょやってたら出来ました。
何をやったのかは分かりませんorz
312 Name: 名称未設定 [sage] Date: 2007/09/14(金) 03:22:19 ID: vPRPlLH90 Be:
まず、NSScrollViewから編集したつもりになってるようだけど、
実際はNSScrollViewの内部にあるNSTableViewから操作している。
NSScrollViewはスクロールを可能にするだけの縁取り的なものに過ぎない。
だからもしリファレンス等で調べるなら、
NSScrollViewではなくNSTableViewを参照すること。

次に、保存方法と編集可能云々は別問題なハズ。
Interface BuilderでNSTableViewのインスペクタのEditableとか
いろいろいじったんじゃない?
313 Name: 名称未設定 [sage] Date: 2007/09/14(金) 11:37:14 ID: gUdBg/zp0 Be:
今回発売されたLogic 8は1000p以上の翻訳済みマニュアル付いてるそうな
世界同時発売で

で、Cocoaリファレンスの翻訳はまだですか?
314 Name: 名称未設定 [sage] Date: 2007/09/14(金) 13:29:15 ID: sFJVO0iJ0 Be:
>>313

Cocoa Break
315 Name: 名称未設定 [sage] Date: 2007/09/14(金) 18:33:16 ID: ZI20taVc0 Be:
cocoa breakは神
316 Name: 310 [sage] Date: 2007/09/14(金) 20:03:38 ID: 5NLP9ylV0 Be:
>>312
NSScrollViewは勘違いでした。
どこを弄ったのか良く分からなかったので、
何度か新規でプロジェクトを作り直したりしたら動いています。
今は何と何をバインディングさせたか理解してるんで、
ちゃんと正しいことをやってるくせぃ。
317 Name: 名称未設定 [sage] Date: 2007/09/14(金) 23:10:21 ID: +9nlJNpQ0 Be:
俺をAppleで働かせてくれるなら死ぬ程翻訳しまくってやってもいい
とほざく求職中の俺
318 Name: 名称未設定 [sage] Date: 2007/09/17(月) 21:49:27 ID: 5CFLrUlr0 Be:
日本語入力 ⇄ 英語入力 をアプリの中から切り替えるには、どうすれば
よいでしょうか。

URL を入力するテキストフィールドがあって、そこが入力状態になったときに
自動的に英語入力に切り替わるようにしたいと思っています。
319 Name: 名称未設定 [sage] Date: 2007/09/17(月) 22:47:37 ID: vp+tEm1m0 Be:
たぶんそういうのはCarbonの中の古いAPIを使うんじゃないかな
320 Name: 名称未設定 [sage] Date: 2007/09/19(水) 12:44:09 ID: QAAMlS8c0 Be:
Core Dataで名前と住所があるとして、NSTableViewで表示させるとします。
で、カラムは名前と住所を表示させるんだけども、
住所が未入力の人は名前を赤で表示させたい。
これってどうやればいいんでしょうか。
321 Name: 名称未設定 [sage] Date: 2007/09/19(水) 16:00:49 ID: 7OHnYPwj0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/09/19(水) 16:01:37 ID: 7OHnYPwj0 Be:
長過ぎて怒られたので分割。

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

@interface MyValueTransformer : NSValueTransformer {

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

@end
323 Name: 名称未設定 [sage] Date: 2007/09/19(水) 16:02:40 ID: 7OHnYPwj0 Be:
//---------- 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 Name: 名称未設定 [sage] Date: 2007/09/19(水) 16:09:53 ID: 7OHnYPwj0 Be:
念のため名前カラムの Bindings の中ね。

Bind to: NSArrayController
Controller Key: arrangedObjects
Model Key Path: (住所の入っているプロパティ名)
Value Transformer: MyValueTransformer
325 Name: 320 [sage] Date: 2007/09/19(水) 20:31:54 ID: QAAMlS8c0 Be:
>>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 Name: 320 [sage] Date: 2007/09/19(水) 20:36:30 ID: QAAMlS8c0 Be:
すいませんが、もう1つ。

名前カラムに新規登録する度に、
headerを押さないでも自動でソートさせるのは、
どうすればいいんでしょうか。
327 Name: 名称未設定 [sage] Date: 2007/09/20(木) 01:30:49 ID: r/uaSxxr0 Be:
>タップ……指で軽く叩く操作。マウスのクリックに相当
>ダブルタップ……2回叩く操作。ダブルクリックに相当
>ドラッグ……写真を移動する時に指をずらす操作
>フリック……リストをスクロールする時に指で軽くはらう操作
>ピンチ……2本指でのつまむ操作の総称
>ピンチアウト/ピンチオープン……2本指の間を広げて拡大する時の操作
>ピンチイン/ピンチクローズ……2本指の間を縮めて縮小する時の操作
http://k-tai.impress.co.jp/cda/article/news_toppage/36312.html?ref=rss

- (void)touchFlicked:(NSEvent *)theEvent;
とかになるのかな?
328 Name: 名称未設定 [sage] Date: 2007/09/20(木) 11:06:40 ID: CMoMWviD0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/09/20(木) 11:12:40 ID: CMoMWviD0 Be:
>>326
dealloc の中で後始末もしておいて。一応、マナーとして。

[[NSNotificationCenter defaultCenter] removeObserver:self];
330 Name: 名称未設定 [sage] Date: 2007/09/20(木) 22:29:15 ID: A01fsnmG0 Be:
iPhone、iPod に OS X を内蔵したおかげで、Cocoaプログラマがすごい増えてるね
331 Name: 名称未設定 [sage] Date: 2007/09/20(木) 23:33:41 ID: Xhf7l+HF0 Be:
>>330
332 Name: 名称未設定 [sage] Date: 2007/09/21(金) 00:21:45 ID: Qi2gwohZ0 Be:
>>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 Name: 320 [sage] Date: 2007/09/21(金) 08:33:51 ID: lSzwq6kK0 Be:
>>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 Name: 320 [sage] Date: 2007/09/21(金) 08:38:01 ID: bDIzEEDW0 Be:
また、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 Name: 名称未設定 [sage] Date: 2007/09/21(金) 12:09:17 ID: T5koP5+L0 Be:
>>334
http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_4.html
の「クラスオブジェクトの初期化」のところを見ると、

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

とのこと。
336 Name: 名称未設定 [教えてくん参上] Date: 2007/09/21(金) 21:44:20 ID: sPcrBli00 Be:
NSView(のサブクラス)にテキスト(日本語)を描画したいのですが、
どうすれば良いでしょうか?
(日本語のテキストを持ったNSStringインスタンスの内容を描画することを想定)
ネット上もあるドキュメント、サンプルコードなどご教示いただければありがたいです。
337 Name: 名称未設定 [sage] Date: 2007/09/21(金) 22:05:02 ID: tcpbBsLq0 Be:
教えようと思ったけどメル欄がうざいからやめた
338 Name: 名称未設定 [教えてくん参上(336)] Date: 2007/09/21(金) 22:12:28 ID: sPcrBli00 Be:
>>337
お騒がせしました。
自己解決しました。

hmdtに置いてありました。
339 Name: 332 [sage] Date: 2007/09/21(金) 22:35:44 ID: Qi2gwohZ0 Be:
>>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 Name: 名称未設定 [] Date: 2007/09/22(土) 01:50:16 ID: x63UH/2b0 Be:
>>339
どこかで「自動的にソートされる」ってのを見てやってみてだめだったので、
いろいろ試した結果が >>328 なんですよ。

もし、バインドだけでいけるなら私も知りたいです。
341 Name: 320 [sage] Date: 2007/09/22(土) 08:53:57 ID: Npi1C4cP0 Be:
>>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 Name: 名称未設定 [sage] Date: 2007/09/22(土) 09:31:10 ID: Jwo4xXMJ0 Be:
削除したのに残るplistは「板データを修復」で消えるんだけど。
343 Name: 名称未設定 [sage] Date: 2007/09/22(土) 09:32:02 ID: Jwo4xXMJ0 Be:
ごめん誤爆
344 Name: 名称未設定 [sage] Date: 2007/09/22(土) 18:08:59 ID: e0U06nBz0 Be:
アレイコントラーのインスペクタにそれらしいチェックがあったような。
つーかインサートするたびにソートしたらうざくね?
345 Name: 名称未設定 [sage] Date: 2007/09/22(土) 21:52:36 ID: YtaGMbG00 Be:
HMDTでiPhone開発の話をしてるけど
touch用の開発環境って出てきてるのかな?
iPhone用のアプリはtouchでは動かないみたいだけど
346 Name: 名称未設定 [sage] Date: 2007/09/22(土) 22:04:54 ID: V8IHJ6+c0 Be:
もうiPod touchがてにはいるようになったの?
347 Name: 名称未設定 [sage] Date: 2007/09/22(土) 22:59:32 ID: YtaGMbG00 Be:
今日出荷案内が来たよ
348 Name: 名称未設定 [sage] Date: 2007/09/23(日) 11:15:15 ID: 74QYrWGQ0 Be:
Core Data アプリで、data を NSArrayController のバインディングで
テーブルビューに表示させているのですが、IB で NSArrayController に
設定した predicate が働いてくれません。

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

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

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

どこで使い方を間違えているでしょうか。
349 Name: 名称未設定 [sage] Date: 2007/09/23(日) 15:30:27 ID: zABjWK1w0 Be:
たぶん根本的に間違ってるよ。
そこに条件式を書いただけでは動かない。
350 Name: 348 [sage] Date: 2007/09/23(日) 16:27:42 ID: 74QYrWGQ0 Be:
>>349
下記ページの一番下の図にある通りのやり方なのですが、
根本的に間違っているのはどの辺でしょうか。
http://journal.mycom.co.jp/special/2005/cocoamvc/011.html

条件式以外には何が必要ですか?
お教え願います。
351 Name: 名称未設定 [sage] Date: 2007/09/23(日) 19:40:13 ID: shGaGM9l0 Be:
>>350

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

352 Name: 351 [sage] Date: 2007/09/24(月) 20:34:56 ID: s/hLGoL70 Be:
>>350

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

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

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

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

>>349 は別の方でしょうか?「根本的な間違い」というのが何なのか、
まったくわからないままなのですが‥。
354 Name: 351 [sage] Date: 2007/09/24(月) 22:12:01 ID: s/hLGoL70 Be:
>>353
>== を使わない方が良い理由は何でしょうか?

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

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

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

お役に立てず、すいません。
355 Name: 名称未設定 [sage] Date: 2007/09/24(月) 22:45:14 ID: s/hLGoL70 Be:
ここ数日のうちにCocoabuilderやCocoa Bindings Examples and Hintsで
NSIndexSetのメソッドcountOfIndexesInRange:
を使ったコードが出ていますが、Tigerにはこんなメソッドはありません。

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

Leopardの発売が更に楽しみになりました。
356 Name: 名称未設定 [] Date: 2007/09/25(火) 20:42:20 ID: DPSBhINH0 Be:
ついでに、WebObjects を、Objective-C にしてほしいよなーー
357 Name: 名称未設定 [sage] Date: 2007/09/26(水) 07:47:06 ID: KqKT5P0s0 Be:
WOはもうディスコンまっしぐらじゃない?
あれ?オープンソースになったんだっけ?
358 Name: 名称未設定 [sage] Date: 2007/09/26(水) 14:05:35 ID: cVuwNs9i0 Be:
Quartz 2D Extream もどうなったのやら。やっぱディスコンまっしぐらかなぁ。
359 Name: 名称未設定 [sage] Date: 2007/09/26(水) 18:52:49 ID: //OJRjK+0 Be:
QuartzGLになりました。
360 Name: 名称未設定 [sage] Date: 2007/09/26(水) 22:58:38 ID: KOSgLSOH0 Be:
質問です。

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


361 Name: 名称未設定 [sage] Date: 2007/09/26(水) 23:16:06 ID: GjSqGsk10 Be:
>>360
必要なだけNSArrayに入れてmakeObjectsPerformSelectorとか、後はNSNotificationとかかな。
362 Name: 名称未設定 [sage] Date: 2007/09/27(木) 00:01:26 ID: PDbAKstz0 Be:
NSViewでまとめてsubViewsで取り出す
363 Name: 名称未設定 [sage] Date: 2007/09/27(木) 00:43:29 ID: 8K+2oe1e0 Be:
過去に同じようにな質問なかったか
364 Name: 名称未設定 [sage] Date: 2007/09/27(木) 00:47:46 ID: jyqt4+rC0 Be:
>>359
thx.
365 Name: 名称未設定 [] Date: 2007/09/27(木) 04:55:55 ID: 1zrfBisP0 Be:
空白またはタブで項目が区切られているレコードからトークン
を切り出すのに、 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 Name: 名称未設定 [sage] Date: 2007/09/27(木) 05:24:39 ID: CM0/B6Sl0 Be:
>>365
NSLog(token); → NSLog(@"%@¥n", token);
でどうかな?
367 Name: 名称未設定 [sage] Date: 2007/09/27(木) 06:07:29 ID: 1zrfBisP0 Be:
NSLog(@"%@¥n", token);  にすると、
日本語フィールドも表示されるようになりました。
が、最後に余計な「A¥n」が出ます。(本当はAの上に変な記号のついた文字。これをいれると
Cocomonarが落ちるので書けない
)よくわからないのですが、エスケープされてる、
ということなのでしょうか。

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

文字コードが悪さをしているのは見当つくのですが、具体的にどこが
悪いのかはさっぱりです。ファイルを読み込むときも、NSDataに落としてから
エンコーディングを変えながらいろいろ試してみたのですが。
368 Name: 名称未設定 [sage] Date: 2007/09/27(木) 06:23:48 ID: CM0/B6Sl0 Be:
>>367
ごめん、¥はバックスラッシュのつもりだった。
とにかくNSLogの日本語表示だけの問題だから気にしなくていいよ。
369 Name: 名称未設定 [sage] Date: 2007/09/27(木) 11:57:33 ID: 1zrfBisP0 Be:
本当だ、¥の代わりにバックスラッシュにしたら期待道通りの結果がでました。
ありがとうございました!!
370 Name: 名称未設定 [sage] Date: 2007/09/27(木) 14:30:21 ID: 8h5IL6rA0 Be:
巨大なテキストファイルから改行コードで区切って1行ずつ読み込んで処理したいのですが、
テキストファイルをすべて読み込んでから改行コードで区切って配列に入れるとメモリを膨大に消費してしまいます。

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

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

後は先読みバッファを作って、特定のサイズ分ファイルを読み込んで、そこから
改行までを取り出して、残った部分をムーブして空いた分だけファイルから
読み込み、これを繰り返す。
372 Name: 名称未設定 [sage] Date: 2007/09/27(木) 16:12:29 ID: 8h5IL6rA0 Be:
>>371
ご教授ありがとうございます。
Cのfgets()関数を使ってうまくいきました。
objective-cで出来るか探してみましたがなさそうですね。

This page was generated by Dat2HTML Rev.