Cocoaはさっぱり!!! version.8 at MAC
[2ch|▼Menu]
1:名称未設定
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のメインウインドウにヘッダーファイルを突っ込む。



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

5384日前に更新/223 KB
担当:undef