- 初心者は教えてくれる方への感謝を忘れずに。
上級者も初心者だった頃の気持ちを忘れずに。
前スレ
Cocoaはさっぱり!!! version.7
http://pc11.2ch.net/test/read.cgi/mac/1161486802/
- 乙かれーしょん
- 1000 名前: 名称未設定 Mail: sage 投稿日: 2007/05/19(土) 00:29:23 ID: uGrJMnws0
[self release];
- カーボンが4げっt
- 前スレ1000の秀逸さに感動した俺は新参?
- [self release]; というのはあまり使わないような気がする。
- -init内で何かミスったときとか。
- じゃ次は [super dealloc] で。
- autorelease されて持ち主のいないウインドウは勝手に閉じてしまうので、自分を
retainして、閉ボタンが押されたときに [self release]; するのは邪道ですか
- ShiftJIS のCSVを開いて、パースするプログラムを書いているのですが、日本語が含まれているとうまく処理できません。日本語が含まれているセルの結果が、文字コードで表示されてしまいます。
1行切り出した段階のparsedStringをNSLogで表示させるとうまく日本語が表示されますが、その後の、columnArrayではうまく表示できません。
何が悪いのか、まったく見当がつきません。どなたか、教えてください。
- 上の続きです
//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); //ここではうまくいく
- ほんと長くてすみませんorz
//カンマで区切って、Arrayへ
NSArray *columnArray = [parsedString componentsSeparatedByString:@","];
NSLog([columnArray description]); //ここの結果がおかしい
[rowArray addObject:columnArray];
}
長文ですみません。。。
- NSArray の description はプロパティリスト形式でエンコードされたものを返すから。
columnArrayの中には正しい値で格納されているはず。
- 要は、NSLog(@"%@", columnArray);
にしとけと、そういう事です。
- >>14
>要は、NSLog(@"%@", columnArray);
え、それって結局 [columnArray description] なんじゃなかったっけ?
ところで >>11 のコードだけど、
NSLog() に直接文字列を渡すのはあんまりよくないかな。些細なことだが。
- 文字列にメタキャラがあったら不味いわな。
- ありがとうございます。
>>13
中身に正しく格納されているのを確かめるには、どうすればいいのでしょうか。
NSLog(@"%@" , [columnArray objectAtIndex:2]);
などとして、日本語が含まれるであろうところを表示させても、何も表示されません。
>>14
%@で指定すると、そのオブジェクトのdescriptionが呼び出されるはずなので、同じ結果ですが。
>>15
NSLog()に直接文字列を渡すのはよくないってのは、どういうことですか?
NSLog([parsedString description]);
とすべきということでしょうか。
>>16
文字列にメタキャラがあるとは、どういうことでしょうか?
メタキャラと言われても、正規表現で使う記号のことしか思い浮かばないのですが。
- NSLogや-descriptionはローカライズされた文字表示には使えない。
エンコーディングが指定出来ないから。
日本語文字を表示したいのなら、自前でNSLog(@"%@",hoge)に相当
するメソッドを作る。
メタキャラの話は、format string vulnerabilityでググれ。いわゆる鉄則。
- writeToFile でファイルに書き出して、Property List Editor で開いてみるとか
- NSPopUpButton を使ったユーザーインターフェイスで、
選択する項目が1つしかないときは NSPopUpButton ではなく
同じ位置に NSTextField でその項目を表示したいのですが、
状態に応じて NSPopUpButton と NSTextField を入れ替える、
というようなことが、IB 上、あるいはコードから可能でしょうか。
見た目だけなら、それぞれの setHidden を入れ替えればできることはできますが、
IB 上で同じ位置に NSPopUpButton と NSTextField を置かなければならず
編集等がやりにくいので、NSPopUpButton と NSTextField とを入れ替える、
ということがしたいです。
- それUI設計を考え直したほうが良いんじゃ。
- NSComboBoxじゃ駄目なの?
- >>17
NSArray *columnArray = [@"%@,%s" componentsSeparatedByString: @","];
NSLog(columnArray);
でいいことがあるよ!
NSLog(@"%@", [columnArray componentsJoinedByString: @" "]);
>>20
NSComboBoxが本命、またはaddSubview:/removeFromSuperviewと思うけど、IBでの編集が目的なら
NSTabViewに入れればいいんじゃね?
- >>22 >>23
NSComboBox は今まで使ったことがありませんでした。
ありがとうございます。調べてみます。
NSPopUpButton の selectedObject のバインディングを使ってるのですが
NSComboBox でも同じことはできるでしょうか。NSComboBox の
Bindings のところには、content、contentValues、value しかありませんが‥
NSTabView は迷ったのですが、NSPopUpButton と NSTextField とを
入れ替えたいものとそうでないものとが UI のレイアウト上散在しているので、
今回の場合ちょっと使いにくいかなと思いました。
- やろうとしていることがよくわからないんだけど
選択する項目が一つしかないときに表示するNSTextFieldは編集できなくていいの?
項目が一つのときはポップアップのUIがうざいからシンプルなNSTextFieldにしたい、ということ?
それならボーダレスにすればシンプルな表示になるけど。
- >>25
すみません、わかりにくい書き方でした。
あるウインドウ上でデータの編集をするのですが、特定のデータを
削除したいときにも、一旦その編集ウインドウを開いて、
ユーザーがデータの内容を確認してから削除する、ということを
やろうとしています。
編集モードのときには、選択肢のあるデータは NSPopUpButton 風に表示し
(ユーザーが選択可能)、削除モードのときには、選択されているデータを
NSTextField 風に表示する(表示のみ、選択、編集は不可)という
インターフェイスにしようとしています。
- NSPopUpButton 1つにして
-(void)setBordered:(BOOL)flag;
-(void)setBezelStyle:(NSBezelStyle)bezelStyle;
-(void)setEnabled:(BOOL)flag;
を組み合わせればいいんでないか?
- >>18 >>19
ありがとうございます。
format string vulnerability ってはじめて聞きました。
プログラミングの初心者がよく陥るミスなのですね・・・。
理由はよく分かりませんが、とりあえず、NSLog("STRING %@" , [columnArray objectAtIndex:2]);
とすると、日本語が含まれている文字列が表示できました。
>>23
どういうことでしょうか。
エラーになって、落ちてしまうのですが・・・。
- >>28
>>23の上2行
>>17,28
>文字列にメタキャラがある
NSLog(columnArray); NSLog([parsedString description]);では「%@,%s」が入力ファイル中に
あったらまずいという話。
- >>29
なるほど。
メタキャラがあるとエラーで落ちてしまう例だったのですね。
- 落ちるだけならいいんだけどね。vulnerabilityなんで悪用されるかも。
- Cocoaスクリプタブルなアプリケーション、モダンな
書き方のサンプルコードってどのあたりを見たらよいでしょうか。
FireWireSDKのVirtualDVHSのソースを見て驚いたのですが、
アプリの主要クラスがAppleScriptのハンドラだけになっていて、
いきなり[self delegate]に丸投げされているとか、ちょっと思い
つかなかった作り方になっています。これって効率的なんですかね?
ただ、やっぱりscriptSuite+Terminologyの古いやり方でした。
10.3.xを切り捨てるとすると、新しい記述方法が使えると思うの
ですが、お勧めなサンプルコードがあれば教えてください。
- Pasteboard に適切でないもの
[pb setData:@"string" forType:... ];
とかを書き込むと、全てのプロセスが停止に至ってしまうのはウチ(10.4.9)だけ?
- 自分で作成したクラス(AppControllerとか)で、NSArrayContorollerでの選択されているオブジェクトの変更を受け取るには、どうすればいいのでしょうか。
つまり、自分で作成したクラスに、NSArrayControllerから選択されているオブジェクトの変更があるたびに、アクションを送信してもらうには、どうしたらいいのでしょうか。
- >>34
NSKeyValueObservingでNSArrayContorollerのselectionを監視。
もしくはNSTableViewのnotificatioかdelegate経由。
もしくはNSNotificationで自分の好きなように。
- >>32
10.5のScript Bridgeの事?
- >>36
いえ、sdefの話です。調べていたらそのものズバリの回答がありました。
>ttp://developer.apple.com/jp/technotes/tn2106.html
「aete をアプリケーションに追加する
・・・(また、用語説明を利用するのにアプリケーションも起動する必要が
あるため、スクリプト作成者は面倒に思います)。
したがって、アプリケーションの一部として同じような aete 用語説明を作成
するべきです。これを行う最も簡単な方法は、sdef を使用して用語説明を作
成し、それから sdp(1) を使用して 3 つのファイル(.scriptSuite、
scriptTerminology、および aete.r)をすべて生成することです。」
このいきなり起動するっていう事象、悩んでいたんですけど、ちゃんと
ドキュメントが有ったんですね。
- >>35
NSKeyValueObservingで、実装することにしました。
ありがとうございます。
- Drawerって親ウィンドウのサイズに依存しますよね。
横に細長なウィンドウだと、Drawer付けられないんですが
なんかいい方法ない?
- 下に出す。
- えくすきゅーずみー!
CoreDataで作ったEntityを途中で変更したとき、永続化させているデータの構造を
変更する手段って用意されているのでしょうか?
よいじかんをー!
- 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.
- >>42さん ありがとう
まいせるふで解決するよー
- QTMovieViewでDRM付きのm4vが再生できないのは
当然なんですか?
- あれ、できなかったっけ。
- やってみたけど、DRM 付きの m4p は聞けた。
m4v は持ってないので確認できない。
- 10.3.9で試してみたけど、再生できなかった。
m4pならできたけど。
- NSOutlineViewとNSTableViewの垂直スクロールが同期した
プログラムを書こうと思っています。
NSTableViewへの値の設定は[treeTableView setBoundOrigin:pos];
で出来ることがわかったのですが、NSOutlineViewからの垂直
スクロール値の読み出し方法がわかりません。
ご存じの方、ご教授ください。
- fffff
- NSOutlineViewってNSTableViewのサブクラスじゃなかったっけ?
- NSScroller の floatValue かな
値設定は setFloatValue:knobProportion: で。
- ダメです。InterfaceBuilderでNSScrollViewは関連づけできますが、
NSScrollerは関連づけができません。
- xxx.h
.
.
IBOutlet NSScrollView* scrollView;// IBで関連づける
NSScroller* hScroller; // 初期化メソッドで値を設定する
初期化メソッドかsetScrollViewで
xxx.m
.
.
hScroller = [scrollView horizontalScroller];
}
ってやるのはどうですか
- InterfaceBuilder 使わなけりゃいいだろ。
- NSTableView と NSOutlineView の垂直スクロールを同期させるというのが良く分からん。
表示中の行の数が同じでなければ setFloatValue: を使っても同期にならないだろうが、
NSOutlineView を使ってるということは折り畳まれた行が存在することが考えられるから
表示中の行の数が同じとも限らんし。
- >>51
'NSScroller'may not respond to '-floatValue:'でした。
- (1) floatValue: ではなくて floatValue になっている?
(2) 警告出ても無視していいから、それで動いたの?
- (1)はい
(2)警告を無視したら56番のメッセージが表示されて作動しません
- コードがどこかおかしいはず。
これで普通に動いたよ。
-(void)syncScroller
{
NSScroller* scroller1 = [scrollView1 verticalScroller] ;
NSScroller* scroller2 = [scrollView2 verticalScroller] ;
[scroller2 setFloatValue:[scroller1 floatValue]];
}
- ありがとうございます。無事動きました。
しかし、これでは使い物にならないですね~
- 具体的に何をしたいのか分からんから
使い物にならないと言われても
そーですかとしか言いようが無い
まあ、標準の部品で実現できそうにないことなら
その表現方法が本当に正しいのかを疑ってみるべきかもしれない
- 自分の望んでいたことが無事にできたのに、使い物にならないっておかしくないか
- 他人が親切に教えてやってるのに、使い物にならない、の一言で切り捨てる
48は以後スルーでよし。
- safari for windowsでmkinoさん涙目?
- 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 と接続やら
どーしたらいいのやらさっぱりわかりません。
近いサンプルコードのありかとか、アドバイスをお願いします。
- >>65
まず一回ちゃんと本読めよ...
- >>65
http://tbboy.cocolog-nifty.com/tbboys_room/2006/08/itunes_935d.html
手前味噌だが。
- >>65
>AppDelegateと新しいnibのFile'sOwnerの関係やら
ヒレガス本読め
- CocoaにHTTP のライブラリはありますか?
一体どこにライブラリの説明があるのか良く分からなくて。。。
- >>69
「HTTPのライブラリ」だけだとなんとも..
クライアント側ならNSURLRequest+NSURLConnection/NSURLDownloadで
だいたいできるんじゃないかな。delegateである程度制御できるし。
もっと細かいことがしたい、もしくはサーバ側の実装をするなら
CFHTTPなどのCFNetworkのC API(非Cocoa)だと思うよ。
- safari for winはcocoa on win(旧open step)で実装したの?
- HMDT読め。
- 65です。
>>66さん
HMDT赤本を読んでみたのですが、別のnibを使うようなサンプルがなく
よくわかってません、すいません。
>>67さん
参考にしてみます。ありがとうございます。
>>68さん
本屋でヒレガス本を探してみます。
ADCのサイトを見てますが探し方が悪いのと英語なので苦労してます。
Cocoaのプログラムを作る時の、nibの持ち方はこうするべき、
リソースはこう持つべき、全体としてこう作るべきとか等の、
定石などがわかるような文献やサイトがあればいいのですが。。。
- thx>>70
>サーバ側の実装をするなら CFHTTPなどのCFNetworkのC API(非Cocoa)だと思うよ。
CFNetworkをググってみまつ。
- >>73
AppDelegateのインスタンスが無いっていうなら,
クラス一覧からAppDelegateをインスタンス化(Instantiate?)すればいいんじゃないの?
Core Dataほとんどやってないから合ってるかわからんけど.
- >>73
(私もCoreDataは使ってないから分からないけど)ちょっと見た限り、
>>75さんのいうようにオリジナルのAppDelegateを流用すればいけるんじゃないかな。
(試してないけど)手順としては
1・オリジナルの*_AppDelegate.m(h)をコピー。
2・コピーした*.mのapplicationShouldTerminateをawakeFromNibへ変更。
3・コピーした*.m(h)をプロジェクトに追加。
4・コピーした*.hを新しいnibに読み込んでインスタンス化。
あとはオリジナルと同じ手順でできると思う。
ひょっとしたらIBでbindingとoutletの設定が必要かも。
私も(読んだ事ないけど)ヒレガス本を推薦しておきます。
- 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って深そうですし難しいです。
- 日本語版は内容が古過ぎるみたいなので、やっぱりヒレガス本推薦取り消します。
そのぐらいなら日本語のサイトでも十分勉強できると思うし。
(実際、私は日本語のサイトの情報だけでやってこれましたよ)
- 65です
>>76さん
ありがとうございます。試してみます。
やはりヒレガス本ですか、探してみます。
- >>78さん
あぁぁ、そうですか...もっともっとググってみます。
- >>77
ログの表示はそのままの意味ですよ。
別nib の File'sOwner に設定しているカスタムクラスでmanagedObjectContextを実装しなきゃ。
>>79
コピーした*_AppDelegate.m(h)内のクラス名も適当に変えてね。
addPersistentStoreWithTypeに使うURLも変更した方がいいかも。
ま、がんばって。
- 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へのアウトレットの名前な
- >>82
すばらしい。
今となってはどうでもいいけど>>76で、
applicationShouldTerminateをapplicationDidFinishLaunchingと勘違いしてました...
- 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するたびに新しいウィンドウが増えていくイメージなんですが
思うようにできないです...
ヒレガス本、近所の本屋にありませんでした...残念
- >84
>メニューバーからFile->Newして複数の同じウィンドウの表示をしたい
んならNewProjectでCore Data Document-based Applicationえらべ。
Introduction to NSPersistentDocument Core Data Tutorialよむといい。英語だが。
- 65です。
>>85さん
そうなんですがDocument-basedにすると、開いたウィンドウ毎に
CoreDataのファイルが作られてしまうのでダメなんです。
CoreDataのファイルは常に一つにしたいのでnon-Documentの
プロジェクトで作っています。
- >>86
single-model multi-windowにするには、
NSDocumentのmakeNewWindowControllerかwindowControllerClassをオーバーライドする。
と、俺様メモに書いてある。
自分で書いたメモなのに意味不明ですが、お役に立つでしょうか?
- >86
>ファイルは常に一つにしたい
MyDocumentのinitで「常に一つ」を読み込むように実装したら駄目か。
- >>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
そうすると複数のウィンドウで同時に編集した場合、データの矛盾が起きると思う。
データストアは一つにしておいてそいつに対してバインドすれば
あるウィンドウでの変更は即座に他のウィンドウに反映されるので問題は起きないはず
- >>84
ちょっと甘えすぎかも。
>MainMenu.nibでHogeControllerをインスタンス化してしまうと、
>複数ウィンドウの表示ができなくなってしまうと思っています。
HogeControllerはHoge_AppDelegate(単一のmanagedObjectContext)へのアクセスを提供しているだけなので問題なし。
>WindowControllerのinitでNibをロードするように最初は書いていました。
initってinitWithWindowNibName:owner:だよね。だったら問題なし。
>目指してるイメージは、HMDT赤本のチュートリアルにあるiTunesブラウザが、
>File->Newするたびに新しいウィンドウが増えていくイメージなんですが
>思うようにできないです...
>>82さんの書かれた方法で可能だと思うよ。
>ヒレガス本、近所の本屋にありませんでした...残念
CoreData、CocoaBinding、その他基本的なものはADCに翻訳されたドキュメントあるよ。
なんだかんだいってある程度分かってるようなので、それらをちゃんと読むのがいいんじゃない?
- 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の翻訳ドキュメントをもっと読んでみます。
- 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
- 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
- >>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"];
も不要にできるけど説明がめんどい。
ま、がんばって。
- 訂正。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window" owner:nil];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
つい「別にWindowControllerいらねーじゃん」の思いが出てしまいました。
- また訂正。スレ汚しごめん。
- (IBAction)newWindow:(id)sender
{
windowController = [[WindowController alloc] initWithWindowNibName:@"Window"];
[windowController setValue:self forKey:@"hoge_AppDelegate"];
[windowController showWindow:self];
}
owner:nilじゃ動かないよね。
限界だわ、もう寝る。
- >>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版が秋以降に予定されているらしいので、それの訳本が出るとよいのですが、、
- すみません。
教えていただけますか?
NSScrollViewをscrollしたとき、ScrollViewにセットされているviewを再描画したいのですが、
どうすればよいですが?
よろしくおねがいします。
- >>97
>AppDelegateは[NSApp delegate]で参照できます。
そっか、CoreData使ったソフトは実際には作ったこと無かったのでそれは思いつかなかった。
>>82でちょっと回りくどいことを書いてすまんかった。
ただまあ>>65はCoreData以前のいろいろをちゃんと理解した方が良いな
WindowControllerの使い方にしても>>94のやり方が正解だし。
ということでヒレガス本をちゃんと読みなさい。
Try&Errorも時には必要だけど、わけわからないままむやみにあれこれいじっても効率悪いだけだから。
- >>98
NSViewBoundsDidChangeNotificationはどう?
- >>100
ばっちり出来ました!!
ありがとうございます。
- 65です。
>>94さん
具体的なコードでのアドバイスありがとうございます。
>>97さん
NSAppというグローバル変数があるのですね、知りませんでした。勉強になります。
>- (NSManagedObjectContext *) managedObjectContext {
> return [[NSApp delegate] managedObjectContext];
>}
をWindowCOntrollerに書いてIBでバインドし直したら動作しました。
アドバイスありがとうございました。
>>89さん
バインディングについて指摘して頂きありがとうございました。
もっと勉強します。
みなさんからヒレガス本を読んだほうがよいというご指摘が多いので、
この週末に大きな本屋に行って探してみます。
なかったらアマゾンから注文してみようと思います。
みなさんからのアドバイスで一歩前進できました。
ありがとうございます。
- >>102
何はともあれ動いて良かったですね。
ただ、これだけではundoが無効になります。
WindowControllerがwindowのdelegateになっているのを確認した上で、
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
return [[self managedObjectContext] undoManager];
}
をWindowControllerに追加しないといけません。
>NSAppというグローバル変数があるのですね、知りませんでした。勉強になります。
[NSApp currentEvent]を覚えておくと、いろいろ役に立つと思います。
それと、ご存じかもしれませんが、
Xcodeのソースで、メソッドやクラス等を
オプション+ダブルクリック、コマンド+ダブルクリックすると
役に立ちますよ。
例えば、NSAppをオプション+ダブルクリックしてみてください。
- おお、横やりだがオプション+ダブルクリックは知らなかった。
これも便利だな。
- 65です
>>103さん
>- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {
> return [[self managedObjectContext] undoManager];
>}
>をWindowControllerに追加しないといけません。
メニューの編集->取り消し、やり直しがディスエーブルされていましたが、
このコードを加えたらイネーブルになりました。
なんでこうなったのか仕組みがわかってないので調べてみます。
>Xcodeのソースで、メソッドやクラス等を
>オプション+ダブルクリック、コマンド+ダブルクリックすると
>役に立ちますよ。
わたしの場合は、メソッド、クラス名を選択して、
コントロール+クリックで表示されるコンテキストメニューから選んでいました。
ダブルクリックのほうが楽ちんですね。
アドバイスありがとうございます。
- 他のアプリから作成したXMLファイルを自分のテーブルにインポートしたいのですが、
なにをどうすればよいのかさっぱりです。
どこか良いサイト、本などがありましたらお願いします。
- そのXMLファイルってのはplist形式なの?
だとしたら,NSDictionaryのdictionaryWithContentsOfFile:で読み込んでいじくればいいんじゃない?
というか,テーブルが何をさすのかがわからない.
- mkinoたんの本にXMLの説明あったよ
- つNSXMLDTD
- 配列の要素値を参照する方法がわかりません。
他の言語みたいにarray[i]ではないのですか?
ネットでどこにも引っ掛からないのが不思議です。
あと配列の内容をテーブルビューに表示させるまでの方法も
さっぱりです。
- 初学者向けの本を最初から最後まで読め。
- >>110
配列の要素値を参照は普通にarray[i]でできない?
ひょっとして配列ってNSArrayの事じゃないよね。
テーブルビューについてはNSTableViewで検索してみなよ。
ま、DataSourceかNSArrayControllerを使えってことだよ。
- >>110
俺は、お前さんがどうやって配列を宣言できたのかの方がさっぱりわかりません。
- >>111-113
レスありがとうございます。配列は解決しました。
非常に単純なミスで要素値をログに吐く時に%dでフォーマットしてたので
変な数字しか出てこず、おかしいなあと悩んでいました。
>>112
NSTableView、DataSource、NSArrayControllerはなんとなくわかって定義しているのですが、
何をどうつなげていいのやら勉強中です。
- >>114
Bindingとか考えずに、基本的なやり方。
・IBで、TableViewのデータソースとなるオブジェクトを指定する。
Controlキーを押しながらテーブルからインスタンスに向かってドラッグ
インスペンタパネルの「Delegate」でDataSourceを指定する。
・そのままRun。すると「データソースとして振る舞うべきインスタンスに、
以下のメソッドが定義されてないから、このテーブルは使えん」的な
エラーがログに吐き出される。そこに挙げられたメソッドを自分で記述する。
TableViewなら最低2つ。OutlineViewなら4つかな。
- 一応定番サイトを貼っておく
http://hmdt.jp/cocoaProg/AppKit/NSTableView/NSTableView.html#section00
- 確かにバインディングって便利だけど、どんどん機能拡張していくと
途中から余計に面倒になって思考が停止していく...orz
- バインディング対応と非対応の差が激しくて、バインディング対応ばっかりで作るとどこかで見たアプリばっかりに成る罠。
変わったことをやろうとすると、バインディングで動くようにするのはかなり面倒。
- だからIBで完結するような処理なんかそんなもんだろ。
なんかコード書かなくてもアプリができるみたいな幻想にとらわれてない?
- >>119
ない
- 今のIBは Binding が目で確認できないのが痛いです。
情報表示して Binding タブを選んでさらに各グループを開いて、、、
遠すぎだよ。
- >>119
思い切りとらわれてた。
あっちとこっちを繋げてハイ出来上がり!って。
でも、結局はIBで簡単にUI作って細かい事はコードでってことになる。
- >>121
instancesタブのツリー表示のほうで、アウトレットの接続と同じように見えるよ。
見やすいかっていうと微妙だが。
- >>123
ほんまや!
微妙やけど無いよりましやな。
おおきに!
- バインディングやCoreDataって微妙な仕様が多いよねー
KVCを多用させるのも、いつまでたってもプロトタイプって感じがしてなんだかなー
- KVCとプロトタイピングって関係ない。
- >>115 >>116
ありがとうございます。なんとかできました。
csvファイルからインポートしてテーブルビューに表示させることができたのですが、
インポートするたびにエンティティにレコードが追加されていってしまいます。
インポート前にdeleteObjectでエンティティのレコードを全件削除をすれば解決するのですが、
なんだかちょっと手間がかかるというか、もっと簡単にエンティティをクリアする方法は
ないのでしょうか?
ご存知でしたらお願いします。
- >>127
一件づつ deleteObject で削除するのでなく、一度に全件削除したいということ?
なら removeAllObjects で一気に削除できるけど。
NSArrayController 使ってるなら [[_arrayController content] removeAllObjects] で消えたはず。
- すいません、くだらない質問ですいません。
Quartz Composer.webplugin
って、コレ、標準で組込まれているんですか?
標準で組込まれているとしたら、
どのバージョンから入っているんですか?
- スボットライト検索欄で、例えばスペース区切りでOR検索が
出来るようにするのは難しいんですかね?
- >>130
Jobs|Gates : Jobs または Gates
Jobs(!Gates) : JobsかつGates以外
Jobs(Gates|Linus) : JobsかつGates、またはJobsかつLinus
- すみません。テーブルビューののカラム表示でSQLの外部結合みたく、
別エンティティから同一キー(1対1の関係)のカラムを表示させるには、
テーブルカラムのバインディング設定だけでは難しいのでしょうか?
- 日本語でおk
- >>128
ありがとうございます。出来ました。
>>130
スボットライトではなくてNSSearchFieldのことでした。すみません。
例えばテーブルビューで「名前が"鈴木"かつ、年齢が"30"」といった
アンド検索が出来るようにしたいのですが、NSSearchFieldに
「鈴木 30」といったように入力して検索出来ればなあと。
- そういうことが出来るようにするのがプログラミングじゃないのか。
- >>134
NSSearchField自体は検索機能を持ってないから,
結局その部分を自分で実装すればいいだけの話.
- そうそう、バインディング使わずに、基本的なウィンドウだけIBで作ってあとはコントローラ側から弄った方が速いしいろいろ出来る。
実用的なものを作ろうとすると、自分で実装しないと使えないのが多いよな。
マクが好きって幻想だけでがんばるのは辛い。orz
人海戦術も出来て儲けも桁違いに稼げるウィンドウズの方が全然魅力的だったり。orz
- C++勉強するのが面倒だからObjective-Cが好きな俺は趣味PG
- テーブルビューなどでマウスホイールやクリックなどのイベントを拾うには
どうすれば良いのでしょうか?
検索すると- (void)mouseDown:(NSEvent*)theEvent;などが出てくるのですが、
これをどうやって使うのかがわかりません。
(NSResponderをどこで設定してどこに繋げたりするのかさっぱり)
非常に厨というか根本的な質問ですみません。
- >>139
・InterfaceBuilderで、NSTableViewのサブクラスMyTableViewを作る。
・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
・MyTableViewのファイルを書き出して、その@implementation内で
- (void)mouseDown:(NSEvent*)eventなんかを上書きする。
- >>140
ありがとうございます。なんとなくわかってやってみたのですが、
>・自分の用意しているインタフェース上のViewを、NSTableViewからMyTableViewに変更する。
IBOutlet NSTableView *fooTableView;
↓
IBOutlet MyTableView *fooTableView;
に変更して、
MyTableView.mで、
- (void)mouseDown:(NSEvent*)theEvent
{
NSLog(@"hello");
}
とやってマウスをクリックしてみたのですが、ログが出力されません。
なにか足りない記述があるのでしょうか?
- >>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のメインウインドウにヘッダーファイルを突っ込む。
- 最近、テーブルビューがらみの厨な質問を乱発してるのって、同じ人?
- そうです。
すみません。
- ヒレガス本くらい読んどけよ。
- NSMutableDictionary があって、中身のキーを一つずつチェックして、キーがある条件を
満たしたら対応するオブジェクトを処理する、ということをしたいのですが、
これ、 -keyEnumerator を使ってやるのはよくないみたいですね。
(enumerate している間に dictionary の構造が変わるとまずいからでしょうが)
でもバリューのオブジェクトの値を変更するぐらいは許してほしいような。
どうやるのが正解(?)なんでしょう。
- >>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];
- >>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.
- 長時間費やしたのですが解決しなかったので質問させてもらいます。
ウィンドウ上に置いたボタンはsetKeyEquivalentで設定したキーで動作できるのですが、
ボタン上にaddSubviewして置いたボタンはsetKeyEquivalentをしてもキーで動作しません。
レスポンダチェイン周りを調べて自分なりに試行錯誤してみましたが解決しませんでした。
どうすれば動作するでしょうか?よろしくお願いします。
- NSResponderを継承しているviewたちをウィンドウに配置してキーを押せば
performKeyEquivalentに入って来ます。上書きしてNSLogで確かめてみました。
しかしNSButtonにaddSubviewしたviewだと反応しないです。
acceptFirstResponderをYESで上書きしたりmakeFirstResponderを試しましたがダメでした。
けどなぜかNSSliderにaddSubviewした場合は反応しました。
まだ謎が解けません、、、お力添えをお願いします。
- NSButton が performKeyEquivalent を拾っているから、subview にはいかないということではなくて?
- キーを押すと警告音がなるのでNSButtonはperformKeyEquivalentを拾っていないようです。
ためしにボタンのサブクラスでperformKeyEquivalentをreturn NOで上書きしてみましたが、
ボタン上のviewに処理が回ってこないという状態です。
- >>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
みんな分かってるけど、それに突っ込むとどうなるかも知ってるからじゃね?
- >>154
いや、それはそれで面白いインターフェースかもと思って試してた
- >>147 >>148
どうもありがとうございます。ちゃんとドキュメントを探すべきでした。
自分の場合値を変更するので >>148 のやり方になるんでしょうね。
- NSButtonの上にボタンを、と例を挙げましたが実際にはボタンやビューということでした。
http://www.pinkapple.tv/uploads/general20070709213058.jpg
左は通常時で右がdrawRectを上書きしたビューをボタン上に配置したものです。
この状態でボタンもビューも独自にperformKeyEquivalentを動作させたかったのです。
(ビューにテキストを表示したり、ビューが他の色、他の機能のものに置き換わったりするので
ボタンの見かけを変えるだけではダメなのです)
ウィンドウ上でなくてボタン上に配置したかったのは、ボタンとビューとでいろいろとデータのやり取りをするのでsuperViewとsubViewの関係にした方が処理が楽だったからです。
ということで>>153さんの方法を試してみます。ありがとうございます。
- >>153さんの方法でできました。
いろいろ調べるとperformKeyEquivalentメソッドはNSResponder、NSView、NSButtonで記述、上書きされていて、NSViewのperformKeyEquivalentは自分のsubviewに処理を送る機能があるようです。
なおかつsubviewへのperformKeyEquivalentが誰も反応しなければNOが返ってきてview自身の処理を行います。
>>153さんのはまさにそれらの機能をコードで記述したものになってます。ありがとうございました。
- いつもお世話になってます。
困っているので助けてください。
NSDrawerを作成し、ウィンドウにくっつけてtggleで動かしています。
ドロワーを開いたまま、ドロワーが画面外になるまでウィンドウを右に動かした後で
ウィンドウを左に持ってくるとドロワーが消えてしまいます。
myDrawer = [[NSDrawer alloc] initWithContentSize:NSMakeSize(300,300)preferredEdge:NSMaxXEdge];
[myDrawer setParentWindow:myWindow];
[myDrawer setContentView:myView];
としているだけなのですが、どなたか原因をご存知でしたら教えてください。
- 上のコードをコピペしてやってみましたが、おっしゃる現象は起きませんでした。
何かmyViewかmyDrawerに追加してる機能が邪魔してるのではないでしょうかね。
- >>161
ひとつだけ気になることがありました。ドロワーを開いた際にその下のウィンドウを
触らせたくないので、
-(void) drawerDidOpen:(NSNotification *)notification
{
[NSApp runModalForWindow:myWndow];
}
-(void) drawerDidClose:(NSNotification *)notification
{
[NSApp stopModal];
}
としています。これがいけないのでしょうか?
- >>162
問題の切り分けくらい自分でやりなよ。
そこまで面倒みきれない。
- >>162
ちょっとやってみましたがnotificationがうまくとれなかったので;確認できませんでした。
申し訳ない。
- >>162
これがいけないのでしょうかってそこをコメントアウトすれば、いけないかどうかくらいすぐわかるだろうが
他人にいちいち確認のコードを書かせる気か?
- 興味本位でやってみたんだけど、間違った行動だったと反省してます。
まぁ答え出てないから意味ないけど。
- Cocoa Bindingで質問です。
テキストフィールドの更新がBindingで行われるように組んだときに、
モデルの属性がごく短時間に何度も更新された場合、アプリがしばらく
固まってしまうのですけれども、これを解決するのに皆さんならどの
ような手法をとりますか?
>ttp://blog.so-net.ne.jp/MyCometG3/2007-07-12-1
- >>141
IB上でNSTableViewをダブルクリックして、
InspectorウィンドウのCustom Classde
MyTableViewに設定する。
シングルクリックだとNSScrollViewがフォーカスされるので注意。
- すげー亀レスorz
- NSPredicateで文字列「book」でフェッチしたあとに
「bookmark」など前回の文字列に付加した形の文字列で
フェッチするとひっかかりません。
毎回nilでクリアするしなかいのでしょうか?
- やっぱり凝った事をやろうとすると手間だよな。orz
まあマクだからって簡単にプログラム作れる訳は無いのだが。
- すみません。基本の基本なのかもしれないのですが…
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をインスタンス化しても、別のインスタンスなので
同じインスタンス変数を持っていない状態になります。
どなたかお教えください。よろしくお願いします。
- >>172
どっか別のところでインスタンス化した object01 を
object02 から参照できる変数に保持しておけば済む話だろう。
object02 のインスタンス変数として保持するか
あるいはグローバル変数として保持するか
その方法は時々によって違うだろうが。
- 便乗して質問しますが、
.hファイルの中で
@interface MyButton : NSButton
{
NSString *myParameter;
}
と宣言するのと、.mファイルの中で
@implementation MyButton
NSString *myParameter;
と宣言するのはどう変わってくるのでしょう?
- 前者はMyButtonのインスタンス変数で、後者は単なるグローバル変数
- どちらの場合も
-(NSString *)getString{
return myParameter;
}
みたいな感じで外部から取得したり、考えずに使えているので使い分けが分からないんです。
インスタンス変数とグローバル変数ググってきます。
- >>176
ごく簡単に説明するとインスタンス変数は使っていいけどグローバル変数は使っちゃダメ
- >>177
分かりました。
そのインスタンスに持たせたいパラメータはちゃんと.hファイルに記述してインスタンス変数にします。
ありがとうございます。
- 「何のために」共通のインスタンスが必要なのかがわかれば、助言の一つも出せるのだが。
- >>179
例えば、.mファイルの中で
BOOL bool; //グローバル変数を宣言
- (void)method{
if(bool){} //処理1
else{} //処理2
}
- (void)changeBool:(BOOL)flag{
bool = flag;
}
という感じだとどうでしょう?
例えなのでmethod自体がBOOLをとるように書き直すというのは無しで。
普段パラメータは.hファイルの中に書いてるんですが、上の方で質問させていただいたように
使い分け、というかグローバル変数が好ましくない理由、状況がまだ今ひとつ掴めてません。。
- 根本的な部分が分かってないのか。
とりあえず、
BOOL bool;
は原則禁止!
static BOOL bool;
で。(もちろん例外はあるが今は考えなくていい)
で、 >180 は
あるインスタンスの動作を変更すればその属するクラスおよびサブクラスのすべてのインスタンスの動作が変更される
ことを意図しているのであれば正解。
但しその場合は意図を明確にするためインスタンスメソッドではなくクラスメソッドによって動作を変更するようにする。
- (void)changeBool:(BOOL)flag じゃなくて
+ (void)changeBool:(BOOL)flag
そうではなくて、インスタンスごとに別々の動作を持つようにするのであれば、間違い。
通常クラス定義ファイルに宣言定義された静的大域変数はクラス変数と呼ばれる。
クラス変数はすべてのインスタンスに共有されるため、その変更はすべてのインスタンスに影響を与える。
インスタンス変数はインスタンスごとに別のものとなるため、変更はインスタンスの中にとどまり他のインスタンスに影響を与えない。
- なるほど、凄く分かりました!試しにNSButtonのサブクラスの.mを以下のように記述し、ウィンドウに複数配置してみました。
static int parameter1;
- (BOOL)sendAction:(SEL)theAction to:(id)theTarget{
NSLog(@"parm1 %d", parameter1);
parameter1++;
return [super sendAction:theAction to:theTarget];
}
別々のインスタンスでもこのパラメータが共有されてることが分かりました。これがクラス変数なんですね。
今回元のメソッドの上書きで試しましたが、+のクラスメソッドで書く意味もよく分かりました。
これを知らないために今までボタンの全パラメータを変更する時に、ボタンの配列すべてに同じメソッドを送っていましたorz
- ↑全ボタンのパラメータ、の間違いでした。
staticはよそから干渉されないように局所的な変数にする、staticをつけないと外部変数と理解しました。
試しに上記のコードからのstaticを外し、まったく同じコードの別のNSButtonのサブクラスを作ってみたら
ちゃんとパラメータが共有されました。凄く勉強になりました。ありがとうございました。
- ちなみに,そのstaticを付けた変数を「クラス変数」という.
- Objective-C にはクラス変数なんてありません。
- クラスオブジェクトが持つ変数はクラス変数じゃないのか?
- どんな教科書(資料)で勉強したの?
http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_4.html#TPXREF118
しかし、クラスオブジェクトの変数を指定することはできません。つまり、インスタンス変数に対応する「クラス変数」はありません。...
... 一部のクラスは、静的な変数を宣言し、それらを管理するクラスメソッドを提供します
(クラス定義と同じファイルで static 変数を宣言すると、その有効範囲は当該クラスのみ、厳密には当該ファイルに実装されたクラスの部分に限定されます。
インスタンス変数と異なり、サブクラスは静的な変数を継承できません)。
- BOOL isNibLoaded = [NSBundle loadNibNamed: nibFileName owner: self];
という一行がうまく動かず困っています。
デバッガで追うと、この行に達すると、次の行以降のブレークポイントで
止まらなくなるので、ここで処理を抜けてしまっている感じです。
nibFileName には、正しく値が設定されているのですが、
nib が読み込まれていれば、表示されるはずのウインドウが
表示されません。
[NSBundle loadNibNamed: nibFileName owner: self]
が失敗するのは、どういうケースが考えられるでしょうか。
- >>188
>nibFileName には、正しく値が設定されているのですが、
>nib が読み込まれていれば、表示されるはずのウインドウが
>表示されません。
本当に正しく値が設定されているという自信はあるのか?
- >>189
あります。
ちなみに nibFileName のところに、@"test" など、いい加減な string を入れると、
isNibLoaded には NO が帰ってきて、普通に次の行以降のブレークポイントへ
進みます。
上記を試してみて思ったのですが、nibFileName に指定している nib 内の
バインディングの設定に間違いがある、とか、そういうのかも知れません。
でもそれを確かめる方法や、nib(特にバインディングの設定)の良い
デバッグ方法がわかりません。
- awakeFromNib が loadNibNamed:owner: 呼び出し中に呼ばれるから、何か実装してるなら
それを一度コメントアウトしてみる。
nibファイルを一度、新規作成して何も変更してないものと置き換えてみる。
とかやってみるのはどうでしょう。
- その前にデバッガコンソールの存在に気づいているかが気になる。
- nib によって読み込まれるインスタンスの awakeFromNib 内に loadNibNamed: あると
無限ループになる
- >>191-193
ありがとうございます。
nib のバインディングの設定を一つ一つはずしていって、
バグの場所を発見できました。
nib のバインディングのデバッグにはいつも苦労するのですが、
何かもっと良いやり方はあるでしょうか。
>>191
awakeFromNib が呼ばれるのは、loadNibNamed:owner: が
「YES を返した後」ではないでしょうか。
今回のバグの場合、awakeFromNib の1行目に置いた
ブレークポイントにも到達しませんでした。
- >>194
>バインディングのデバッグ
バインディングはあんまりやってないけど、consoleメッセージとexceptionはいているなら
gdb> break -[NSException raise]
でなんとかなってる。
- 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自身)を指定して呼び出します。
- - (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 を使うべきなのでしょうか?
わかりやすく書こうと思って書いたのですが、伝わりますでしょうか…
- NSSliderからのアクションを
- (IBAction)myAction:(id)sender{
NSLog(@"action");
}
と受けると、スライダーのmouseDown、mouseDrag、mouseUpのタイミングでアクションが送られてくるようなのですが、
これを、この受け手側のmyAction内で分類できないでしょうか?
スライダーのサブクラスを作らなくてもこれらが分類できればいいなと思いまして。
御教授願います。
- 自己解決
- (IBAction)myAction:(id)sender{
NSEvent *event = [[NSApplication sharedApplication] currentEvent];
if ([event type] == NSLeftMouseDown) {}
if ([event type] == NSLeftMouseUp) {}
}
のようにすればマウスの動作を分類できました。
しかしこの方法だとなぜか、重いQuickTimeMovieを動かしている時に
mouseUpの方を取りこぼしてしまうので、やっぱりスライダーのサブクラスを書いてみようと思います。
- う~
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: は置き換わらないようです。
- >>200
関係ないかもしれないけど、Mail.app は言語環境を英語にして起動すると UTF-8 で送信される
- >>201
はい、言語環境が関係ありそうですが、日本語なんですよねえ。
しょうがないのでAppleScriptでMail.appつついて送信したら、
ISO-2022-JP で送れましたので、とりあえずこれで良しとします。
- >>202
言語設定以外に、そのアプリが日本語にローカライズされててもダメ?
- >>203
はい、ローカライズしてます。
Localizable.strings(Japanese) から文字取れてますし、
Info.plist の CFBundleDevelopmentRegion を Japanese にしても一緒でした。
他に触るとこなかったかな?
- mail.appの文字コード自動判定がEudoraに比べて手厳しく
機種依存文字が含まれていると、
Content-Type: text/plain; charset=US-ASCII; format=flowed
Content-Transfer-Encoding: base64
になり、相当苦しみました。
素人なんで文字コードまでお勉強できてないのですが。。。
- しかし NSMailDelivery ってどのぐらい Mail.app と連携してるんだろ。
なんとなく、単独で使えるようにはあまりメンテされてない感が...
しかし、今日び複数アカウントがあり、それぞれメールの送受信法が違うし、
メールの中身もいろんなものがあり、たかがメールを送るのも大変だよな。
- NSMailDeliveryはAPIを見る限り、
貧弱すぎてMail.appでバリバリ使っているとは思えないよね。
NSMailDeliveryってヘッダ見ると1997のままだけど10年放置なの?
JavaMailレベルとは行かないまでも、もっと拡張してほしい。
- Cocoa Bindings で NSTextField に文字を表示させてるのですが、
表示させる文字を setValue: forKey: で更新すると、それまで表示していた文字と、
新しい文字とが重なって表示されてしまいます。
例えば今まで「十」の文字を表示していたところに、「口」の文字をセットすると
その2つが重なり合って、「田」みたいになってしまうのです。
バインディングの設定のせいなのか、コードに誤りがあるのかもわかっていません。
上書きされたはずの文字「十」は、誰が保持しているのでしょうか。
- >>208
>新しい文字とが重なって表示
ウインドウリサイズ等して再描写しても?
Application delegateにKVを持たせ、NSButton>appDelegate action内でsetValue:forKey:してみたけど意図通りになった。
- >>209
ありがとうございます、再描画したらきちんと表示されました。
再描画せずにきちんと表示するには、何が足りないでしょうか。
- >>再描画せずに
すみません。
リサイズなどをしなくても再描画するには、何が足りないでしょうか。
- >>211
setter(内で値の加工をしている?内で他のオブジェクトにsetしている?)やKVOを見直したほうが
いいと思うけど、再描写は
[nsview setNeedsDisplay: (BOOL)]
か(他のスレッドからなら)
[nsview display] または、[[nsview superview] display]
- >>212
setter は、
- (void) setName:(NSString *) aString {
[aString retain];
[name release];
name = aString;
}
となっています。
view に対して再描画させるとなると、
バインディングを使っている意味が薄れるので、
自分としても KVC/KVO で対処したいのですが‥。
- 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 を使っている?いない?
- NSViewの上にNSImageを並べて表示させたいのですが、さっぱりです。
- Cocoa使ってるとよくCarbonのAPIを呼び出さなければならないことがありますけど、
いっそ入門Carbonとか読んでみた方がいいですかね
- >>214
ってゆうかそれだって例えば他のスレッドが [obj setName:]をほぼ同時に呼んだら
アウトだろ。
- >>214
NSMatrixでNSImageCellを使うのが手っ取り早い.
- ループ内で座標にイメージのサイズを足せばいいだけじゃん
- >>218 >>219
ありがとうございます。
NSMatrixで行列表示ができました。
でもなぜか、セルがウィンドウの上に切れて表示されるのと
putCell:atRow:column:でNSImageCellで画像をセットしても
同じ画像ばっかり表示されるんです。
もう少し勉強してみます。
- >>220
NSMatrixにaddRow/addColumnして、[self cellAtRow:y column:x]に対してイメージをセットしたらどうかな
- selfはNSMatrixね
- なんかちぐはぐなレスになった>>214はあぼーんで。スレ汚しスマソ
>>217 指摘thx.
- 220です。
自己解決できました。
NSScrollView内にNSMatrix作ったら左上から右下に向かって綺麗に並びました。
重複画像は単純にNSImageのalloc/releaseの記述ミスでした。
NXu0UGJP0さん、ありがとうございます。
次は画像の影付けにチャレンジ。
これまた難易度が高そうです(^^;
NSImageにaddShadowとかあったら楽なのになあ。
- NSSegmentedControlをクリックした時、デフォルトだとマウスアップ時に選択が移行するのですが、
これをマウスダウン時のタイミングで選択を変えるにはどうしたらいいでしょう?
sendActionOn: メソッドを使ってみたのですがうまくいかず
今はマウスダウンの中を書き換えようとしてるのですが、
NSTabViewのtabViewItemAtPoint メソッドのようなものがNSSegmentedControlにはなくどうしてよいものか分かりません。
御教授よろしくお願いします。
- サブクラスで
- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseUp:theEvent];
}
- (void)mouseUp:(NSEvent *)theEvent
{
}
としてみるとか.
- NSSliderなんかと同じでNSSegmentedControlにはmouseUpが実装されてないので
例えばサブクラスで
- (void)mouseUp:(NSEvent *)theEvent{
NSLog(@"MouseUp");
[super mouseUp:theEvent];
}
としてもここに処理が回ってこないんです。
なので>>226のコードだと何も処理されないんです。。
正確にはNSSegmentedControlにmouseDownは継承されてるけど
オーバーライドされて機能しないようになってるってことだと思いますけど。
- NSSegmentedCell (NSCell)の
sendActionOn あたりを変更してみるとか?
- 既出だったかスマン
- 普通にこの辺じゃないの?
-[NSCell trackMouse:inRect:ofView:untilMouseUp:]
-[NSCell startTrackingAt:inView:]
-[NSCell continueTracking:at:inView:]
-[NSCell stopTracking:at:inView:mouseIsUp:]
かなり面倒くさいけど。
- ありがとうございます、とりあえず現状
-(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を返すので不完全です。
もっとスマートな方法があれば是非。
- oomori.comってどうなったんだ?
- 先日つながらなくなって、一時復活したようだけど
それからまたつながらなくなったみたい
どうしちゃったんだろうね
- 愛想を尽かしたんじゃないかな。
- ttp://www.haloscan.com/comments/mkino/20070810/
- cocoaで飯食ってけますか?
- Cocoaは嗜好品であって主食にはなりません。
- >>235
面白いけど、MyCOMの記事への指摘を何故日記のコメントにするのか分からんな。
- mkimoさん?
- mkinoってエムキノって読むの?
- >>238
俺も思た。
しかもコメント先はツールバーアイコンに関するエントリで、
マイコミは何にも関係ないんだもんな。
メールでもなんでもすりゃいいものを、ちょっとマナー悪いように思う。
- ダイナミックObjective-Cへの突っ込みにHMDTの最新エントリのコメント欄使う奴はけっこうよく見るだろ。
- >>242
そーいうもんなのかな? 俺が自分のサイトでやられたらあんまり良い気分じゃないけど。
あまりにも主題と関係のないこと書かれたら、後からそこ探すの大変だし。
ま、時々見かけるmkinoマンセー連中もウザいし、どうでもいいんだけど。
- >>239
わろた。
実物見たことないが、キモいのかw
- コメント欄で主題と異なることを書き込むのは俺もマナー違反だと思うよ。
でも、Macでプログラム系の掲示板がどこかほしいな。検索機能付きのやつ。
HMDTにあった掲示板もスパムでやられて閉鎖されちゃったし、やっぱり
運営難しいのかな。こんな感じのがあればいいのに。
>ttp://www.atmarkit.co.jp/bbs/phpBB/index.php
- 質問です。
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です。
どこが悪いのかさっぱりです。
- エンコードがUTF-8じゃないんですか?
エンコードが分からないときは
+[ NSString stringWithContentsOfURL:usedEncoding:error:]
を使ってください。
聞く前に NSError を返してもらって調べるくらいしましょうね。
- >>247
できました。ありがとうございます。
NSShiftJISStringEncodingと入れて、
いろいろとサイトのURLを入れて試してみたのですが、
取れるサイトと取れないサイトがあるようですね。
自分のサイトのCGIと連携させるので決め打ちでも問題ないのですが。
精進します。
- >>248
NSURLRequestとかも試してみたら?
- >>245
PukiWikiなら設置してある。
放置気味だけど。
ttp://cocoawiki.aerial.st
- NSOpenGLViewが複数あるとき,一個のViewの方でpickしたら
もう一個のViewが描画されなくなるんだけどなんでだろう。
glRenderMode(GL_SELECT);
と
gluPickMatrix
を実行しないと問題無い。
その後は
glRenderMode(GL_RENDER);
にちゃんと戻している。
- >243
実際あの指摘は正しいんだろか?
初心者の漏れにはサパーリわからんのだけど。
- >>252
サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?
見たところ、デザインパターン自体からは多少逸脱して、
ObjC/Cocoaでの類似の機能やその実現の説明に入りかけているように見える。
これはこれで見えてくるものがあるはずなので今後の展開に期待。
ご本人もあえてそういう感じの意識で連載をしているようだ。
Commandに関しては最初の方でNSDocumentを例に使っているので、
今後もその流れでいくのかな。
最終的に「Cocoaパターン」とでも呼べるものが出来上がったら面白いなあと思う。
し、もしかするとそんな将来の著作も狙ってたりして。
- なんだ、ADCサイトに既に元ネタちっくなものがあるじゃないか...
あとはそれをどこまで膨らませて(いい意味で)書けるかだなあ。
- 連投すまん。>>254のことはデザパタ関連の連載の最初にすでに断ってあった。
だから本人もそれを単純に踏襲したものにならないように書いてる筈だと期待。
- え?
期待してんの?
- アクセス数の多いサイトの、本来は何の関係もないページトップのエントリに対して、
わざわざ自分のサイトへのリンクを記載してコメントするのはちょっと気が引けるな。俺は。
なんか宣伝みたいになっちゃうじゃん? 「こんな鋭いツッコミする俺ってどう?」みたいな。
ある程度気心の知れた常連さんみたいだし、そういう意図はないんだろうけど。
といいつつ、話の展開は気になる。
- >253
>サパーリな奴が、指摘が正しいかどうかだけ知って何の役に立つ?
フツーに野次馬なだけです
- 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
- >>259
SetMovieGWorld は CreateMovieStrage の後なんじゃね?
qtMovie が NULL の状態で SetMovieGWorld しても意味ない気がする。
Movie 作っても表示はされなくて、インスタンス化してから表示されるんじゃないか?
- >>260
ありがとうございます。仰る通りにCreateMovieStrage(…) の後に SetMovieGworld(…) を
やってみましたが、同じ結果でした。
で、関係する関数を調べてみたんですが、NewGWorld(…) が OSX10.4 で廃止されていました。
コンパイルエラーも実行時エラーも出てなかったので通っているものとばかり…
代わりの関数って何になるんでしょうか?
もちろん自分でも調べてみますが、ご存知でしたらお教えください。
- 廃止?廃止予告じゃないの?
- >>261
というか、関数のエラーチェックをしてないのでは?
どこで引っかかっているかはきちんと確認したか?
そのケースは普通GWorldがきちんと出来ていないか
Setではねられているかどちらかでは。
- >>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の方が良いのかな?)を調べてからもう一度チャレンジしたいと
思います。アドバイスして下さった方々、ありがとうございます。
- 既に解決していたらよけいなお世話だが、
ちょっと最初のソース>>259を見ていて気になったんで、、、
SetMovieGWorldで設定しているqtMovieは実際描画を行っているQTMovie
(こっちはQTKitの方ね)を指している?
CreateMovieStrageはQTKitの関数ではなくTraditionalなQuickTime
の関数なので、どこかでこのStorageをQTKitのQTMovieに変換する
ためにmovieWithQuickTimeMovieとかを呼んで実際に描画をしている
QTMovieを作っているはずなんだけど、このパラメータとして使って
いるMovieに対してSetMovieGWorldをやらないと意味ないよ。
実際の所CreateMovieStrageに対応するQTKitの関数が無いのが問題
なんだけどね、いまQuickTimeに手を出すのはカオスに手を出すよう
なものだから必要に迫られていないのならばQTKitがもう少し充実す
るまで待った方が良いような気がする。
-
QTKitは試していないけど
http://lists.apple.com/archives/QuickTime-API/2006/Feb/msg00239.html
- >>265
それだね。QTKitCreateMovieのサンプルソース見ると
quicktimeMovieFromTempFileでストレージを作る際に
新規Movie構造体を一緒に作って、かえってきたMovieを
使ってQTMovieインスタンスを生成してる。
別のMovie構造体にセットしてもそりゃだめだな。
- >>265, 266, 267
おおおぉ、ありがとうございます!解決致しました。
quicktimeMovieFromTempFileから返って来たMovieについて、SetMovieGWorldをかけ
QTMovieを作ったら見事に消えました。厚くお礼を申し上げます。
>いまQuickTimeに手を出すのはカオスに手を出すようなものだから
確かに、そんな気分になりました…こういうのが carbon の世界なんでしょうか?
何はともあれ、つきあって下さった皆様本当にありがとうございます。
- >>268
Carbonの世界はCarbonの世界で悪くないよ。Appleは終息方向に向かいたいみたい
ですけどね。
単にQTKitが未完成でTraditionalな関数を呼ばないと実現できない事が多すぎて、
何をやるにもちょこちょこCarbonが顔を出すので、CocoaからQuickTimeにアプロー
チするのが「カオス」。
Carbonだけで閉じた世界で使う分には「今の所」QuickTimeは普通に使える。将来
は逆にCocoaに手を出さないと機能が使い切れなくなると宣言されてるけどね。
まあ、Carbonはここではすれ違いだ。失礼しました。
- てことでObjective-C2.0のQTKitに期待なわけですね。
- >>269, 270
なるほど、Carbon からは QuickTime が使い易いんですね。
Leopard の QTKit が使い勝手よくなっていることに期待します。
後2~3ヶ月か。うーん早く出して欲しいなぁ。
- >>269
判ってると思うけど、QuickTimeはCarbonじゃ無いよ。
GWorldとは手を切って、OpenGL Contextに移行しよう。
- >>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が作れる?(一番分かってないです)
という風に理解しているのですが、合っていますか?
- 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の中だけで相互にいじれると。
- 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テクスチャに変換してるん
だろうと思うんだけど、すごく無駄が多く感じるんだよね
- >>275
MyCometG3氏と見た。
- >>274,275
うーん、覚えないといけない事がいっぱいですね…一つずつ学びたいと思います。
ありがとうございました。
- 初歩的質問で申し訳ないのですが、NSString文字列の
制御文を書きたいのですが、どのようにすればいいのでしょうか。
NSString* hoge;
hoge=@"あいうえお";
if (hoge =@"あいうえお") {
//もしhogeの内容が あいうえお ならここのコードを動作させたい
}
のように書いたのですが、if の行でエラーが出てしまいます。
- >>278
if (hoge isEqualToString:@"あいうえお") {
- 朝からcocoa
いいね素晴らしいね
- >>279
分かりました。勉強不足でした。
ありがとうございます。
- >>279
@""の中に日本語はまずくないですか?
あえてソースの中に日本語書くのならエンコードをutf8にしておいて、
if ( [hoge isEqualToString:[NSString stringWithUTF8String:"あいうえお"]] ) {
}
くらいでは。
- >>278
この例だと、>>278が意図したようには動かないが、エラーも出ないのでは。
- オブジェクト定数に日本語使ったからエラー出たんじゃね?
- その前に条件式内での代入は不問なの?
>のように書いたのですが、if の行でエラーが出てしまいます。
どんなエラーかも分からないし。
- パールや簡易系スクリプト上がりだと苦労するよ。オブジェC。
- CocoaDevCentralあたりにPHPからの移行チュートリアルみたいなのあった気がする。
英語だが。
- うそん
俺AppleScript上がりだけどすんなり理解できたよ、ObjC
- Cocoa初心者です。
ヒレガス本(日本語版)は、済ませました。
次にやると良い入門書があれば、ご紹介ください。
- >>289
何を作りたいの?
- テーブルビューでコアデータにバインドしないカラムのソート方法がさっぱりです。
ソート用にそのカラムの配列を作ってソートディスクリプタをかますのですか?
- NSTableView の - (NSArray *)sortDescriptors;
NSMutableArray の - (void)sortUsingDescriptors:(NSArray *)sortDescriptors;
がヒントというか殆ど答え。
- NSTextFieldについて質問させてください
Interface Builderの設定でLayoutがWrapsの場合(Viewの幅で自動改行)に、
横幅を変えずに高さだけ変えてテキストがちょうど収まっているように
プログラムでリサイズさせるにはどうしたらいいでしょうか?
[NSControl sizeToFit]だと横幅が変わってしまいます
- >>291
ttp://blog.so-net.ne.jp/finky/2005-04-04
- >>293
IBのインスペクタのサイズで,
NSTextFieldのサイズを上下にリサイズするように設定してみては.
上下にはバネ,左右は直線の表示に.
- >>294
そこに書いてあることは間違ってるとは言わんが
すごく誤解を招きそうな感じの書きっぷりになってるな
- >>295
ダメでした。IBの「Size to Fit」メニューではAutosizing設定に
合わせてくれるんですが、プログラムでは
[textField setStringValue:@"とても長~~~~い1行"];
[textField sizeToFit];
としても横に長く伸びてしまいます
- >>297
NSTextFieldのsetLineBreakMode:でラップするよう設定してみては?
詳しくはリファレンス参照.
- 自己解決しました。これでできそうです。
NSRect fr = [textField frame];
fr.size = [[textField cell] cellSizeForBounds:[_textField bounds]];
[textField setFrame:fr];
- >>292 >>294
回答ありがとうございます。
チャレンジしてみます。
- NSTableView(NSArrayController)で最後にソートしたカラムとソート順をアプリの終了時に保持して、
次回起動時に前回の状態でソートするにはどうすればよいのでしょうか?
[[[NSArrayController sortDescriptors] objectAtIndex:0] description]
をNSStringに代入してプロパティリストに保存できたのですが、
なんか無理矢理なやり方かなと。
良い知恵がありましたらお願いします。
- 自分で変数もってそれをプロパティリストに保存して起動時にソートしなおすとかは?
とNSTableView使ったことないけど言ってみる
- descriptionで保存するんじゃなくて、sortDescriptorsにNSArchiver使った方がいいんじゃない?
で次回起動時にはNSUnarchiverを使って復元したものをsetSortDescriptors:して再ソート
- ass乞食がcocoaのhtmlレンダーマンを掘り当てたらしいね
- 中国人は赤ん坊も食べる
http://www21.tok2.com/home/saigoutakamori/Chinese_culture_that_eats_baby1.htm
- ああ、さっぱりわからないよ兄さん。
- NSPredicateで" カラム=='値' "というのはできるのですが、
" 関数の返り値=='1' "みたいなことは出来るのでしょうか?
よろしくお願いします。
- またHMDT恒例の、エントリ無関係ツッコミが始まりましたな。
- >>307
オブジェクトobj の関数(メソッド)func が数字を返すとき、
BOOL result = [[NSPredicate predicateWithFormat:@" func == 1"] evaluateWithObject:obj];
みたいなこと?そのまんまだけど
- Core Dataを使って、非常に簡単なアプリを作ろうとしています。
単語帳みたいな感じのものなんですが、
Cardエンティティ:
- 属性word (String)
- 属性meaning (String)
というデータを持っています。
例えば、(word, meaning) = ("hello", "こんにちわ")みたいに格納します。
さて、wordの表示は左側にNSTableColumnでリスト表示させ、
その右側にNSScrolViewでselectされた単語の意味を表示させます。
このとき、NSScrolViewから意味を編集したいのですが、
この中身を日本語のプレインテキストにしたと思っています。
属性meaningのタイプはStringのままでいいのでしょうか。
Stringにすると、実行時に右側のNSScrolViewを編集することができなくなります。
そこでタイプをバイナリデータにしてみたんですが、
当然、作成されたXMLの中身がバイナリになって可読性が悪くなります。
タイプをStringのままで、NSScrolViewを編集できるようにするにはどうしたらいいでしょうか。
- すいません。
ごにょごにょやってたら出来ました。
何をやったのかは分かりませんorz
- まず、NSScrollViewから編集したつもりになってるようだけど、
実際はNSScrollViewの内部にあるNSTableViewから操作している。
NSScrollViewはスクロールを可能にするだけの縁取り的なものに過ぎない。
だからもしリファレンス等で調べるなら、
NSScrollViewではなくNSTableViewを参照すること。
次に、保存方法と編集可能云々は別問題なハズ。
Interface BuilderでNSTableViewのインスペクタのEditableとか
いろいろいじったんじゃない?
- 今回発売されたLogic 8は1000p以上の翻訳済みマニュアル付いてるそうな
世界同時発売で
で、Cocoaリファレンスの翻訳はまだですか?
- >>313
Cocoa Break
- cocoa breakは神
- >>312
NSScrollViewは勘違いでした。
どこを弄ったのか良く分からなかったので、
何度か新規でプロジェクトを作り直したりしたら動いています。
今は何と何をバインディングさせたか理解してるんで、
ちゃんと正しいことをやってるくせぃ。
- 俺をAppleで働かせてくれるなら死ぬ程翻訳しまくってやってもいい
とほざく求職中の俺
- 日本語入力 ⇄ 英語入力 をアプリの中から切り替えるには、どうすれば
よいでしょうか。
URL を入力するテキストフィールドがあって、そこが入力状態になったときに
自動的に英語入力に切り替わるようにしたいと思っています。
- たぶんそういうのはCarbonの中の古いAPIを使うんじゃないかな
- Core Dataで名前と住所があるとして、NSTableViewで表示させるとします。
で、カラムは名前と住所を表示させるんだけども、
住所が未入力の人は名前を赤で表示させたい。
これってどうやればいいんでしょうか。
- >>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 に設定しておく。
- 長過ぎて怒られたので分割。
//---------- MyValueTransformer.h ----------
#import <Cocoa/Cocoa.h>
@interface MyValueTransformer : NSValueTransformer {
}
+ (Class)transformedValueClass;
+ (BOOL)allowsReverseTransformation;
- (id)transformedValue:(id)value;
@end
- //---------- 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
- 念のため名前カラムの Bindings の中ね。
Bind to: NSArrayController
Controller Key: arrangedObjects
Model Key Path: (住所の入っているプロパティ名)
Value Transformer: MyValueTransformer
- >>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の思想みたいなもんが見えてきた。
これは便利そうだ。
- すいませんが、もう1つ。
名前カラムに新規登録する度に、
headerを押さないでも自動でソートさせるのは、
どうすればいいんでしょうか。
- >タップ……指で軽く叩く操作。マウスのクリックに相当
>ダブルタップ……2回叩く操作。ダブルクリックに相当
>ドラッグ……写真を移動する時に指をずらす操作
>フリック……リストをスクロールする時に指で軽くはらう操作
>ピンチ……2本指でのつまむ操作の総称
>ピンチアウト/ピンチオープン……2本指の間を広げて拡大する時の操作
>ピンチイン/ピンチクローズ……2本指の間を縮めて縮小する時の操作
http://k-tai.impress.co.jp/cda/article/news_toppage/36312.html?ref=rss
- (void)touchFlicked:(NSEvent *)theEvent;
とかになるのかな?
- >>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];
}
- >>326
dealloc の中で後始末もしておいて。一応、マナーとして。
[[NSNotificationCenter defaultCenter] removeObserver:self];
- iPhone、iPod に OS X を内蔵したおかげで、Cocoaプログラマがすごい増えてるね
- >>330
?
- >>326
NSArrayControllerのsortDescriptorsを設定してあれば、自動的にソートされます。
あと、NSValueTransformerの登録はNib fileのロード前にする必要がありますから
Value Transformer Programming Guide Registering a Value Transformerでは
application’s delegateでinitialize: class messageで行うことが推奨されています。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
ではタイミングが遅いように思います。
問題なく動いているようなので、結果オーライかもしれませんが。
- >>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"を見つけてくれるんでしょうか。
- また、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;
}
とするべきですか?
長々とすみません。
- >>334
http://developer.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/3objc_language_overview/chapter_7_section_4.html
の「クラスオブジェクトの初期化」のところを見ると、
クラスは自身が使用される前に、ランタイム環境を準備する機会を与えられます。
initialize は継承されるため、サブクラスのために何度も呼び出される可能性があります。
とのこと。
- NSView(のサブクラス)にテキスト(日本語)を描画したいのですが、
どうすれば良いでしょうか?
(日本語のテキストを持ったNSStringインスタンスの内容を描画することを想定)
ネット上もあるドキュメント、サンプルコードなどご教示いただければありがたいです。
- 教えようと思ったけどメル欄がうざいからやめた
- >>337
お騒がせしました。
自己解決しました。
↓
hmdtに置いてありました。
- >>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では索引や、他の章で引用されているのに、この項が載っていません。
- >>339
どこかで「自動的にソートされる」ってのを見てやってみてだめだったので、
いろいろ試した結果が >>328 なんですよ。
もし、バインドだけでいけるなら私も知りたいです。
- >>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"];
}
- 削除したのに残るplistは「板データを修復」で消えるんだけど。
- ごめん誤爆
- アレイコントラーのインスペクタにそれらしいチェックがあったような。
つーかインサートするたびにソートしたらうざくね?
- HMDTでiPhone開発の話をしてるけど
touch用の開発環境って出てきてるのかな?
iPhone用のアプリはtouchでは動かないみたいだけど
- もうiPod touchがてにはいるようになったの?
- 今日出荷案内が来たよ
- Core Data アプリで、data を NSArrayController のバインディングで
テーブルビューに表示させているのですが、IB で NSArrayController に
設定した predicate が働いてくれません。
hoge という属性を持つ Core Data のエンティティがあり、
NSArrayController の IB の Inspector の Attributes で
hoge != "hogehoge" として Set Predicate したのですが、
テーブルビューの中に hoge == "hogehoge" のデータも含め
全データが表示されてしまいます。
ちなみに、hoge == "orz" などいい加減な predicate を設定しても
動作は変わらず、すべてのデータが表示されます。
バインディングの設定の方は、何度も確かめたので正しいと思います。
どこで使い方を間違えているでしょうか。
- たぶん根本的に間違ってるよ。
そこに条件式を書いただけでは動かない。
- >>349
下記ページの一番下の図にある通りのやり方なのですが、
根本的に間違っているのはどの辺でしょうか。
http://journal.mycom.co.jp/special/2005/cocoamvc/011.html
条件式以外には何が必要ですか?
お教え願います。
- >>350
== ではなくて、likeとかcontains[cd]を使いましょう
- >>350
Set Predicate ボタンはちゃんとクリックしているのでしょうね?
- >>352
クリックしています。わかりにくい書き方でしたが、>>348 の
「Set Predicate した」というのはボタンを押したという意味です。
>>351 で predicate の書式についてお教えいただきましたが、
== を使わない方が良い理由は何でしょうか?
== と書いた predicate を NSArrayController にバインディングで
設定した場合にはきちんと動作しており、書式は問題ないと思うのですが。
>>349 は別の方でしょうか?「根本的な間違い」というのが何なのか、
まったくわからないままなのですが‥。
- >>353
>== を使わない方が良い理由は何でしょうか?
こちらの勘違いでした。
Predicate Programming Guideの例で
>Simple comparisons, such as grade == 7 or firstName like 'Mark'
というのがあがっていて、文字列の比較には==が使えないと思い込んでいました。
昨日試したら==でもOKでした。
predicateの設定なんて、predicateを書いてボタンをクリックするだけで他にすることはないはずです。
例えば、NSTreeControllerで parent == nilと設定すれば、第一階層のアイテムだけが
表示されます。
お役に立てず、すいません。
- ここ数日のうちにCocoabuilderやCocoa Bindings Examples and Hintsで
NSIndexSetのメソッドcountOfIndexesInRange:
を使ったコードが出ていますが、Tigerにはこんなメソッドはありません。
Leopardで導入されるものでしょうか?
NSTableViewのdrag & dropのコードで、似たようなメソッドを作ったものですから、
Appleが正式にサポートするとうれしいです。
Leopardの発売が更に楽しみになりました。
- ついでに、WebObjects を、Objective-C にしてほしいよなーー
- WOはもうディスコンまっしぐらじゃない?
あれ?オープンソースになったんだっけ?
- Quartz 2D Extream もどうなったのやら。やっぱディスコンまっしぐらかなぁ。
- QuartzGLになりました。
- 質問です。
大量のボタンに対して、同時に同じメッセージを投げたいんですが、
1つのアウトレットは1つのオブジェクトしか指定できません。
大量のボタンの数だけアウトレットを用意するのもスマートではないと
思いますが、何か良い方法ありますか?
よろしくお願いします。
- >>360
必要なだけNSArrayに入れてmakeObjectsPerformSelectorとか、後はNSNotificationとかかな。
- NSViewでまとめてsubViewsで取り出す
- 過去に同じようにな質問なかったか
- >>359
thx.
- 空白またはタブで項目が区切られているレコードからトークン
を切り出すのに、 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です。
- >>365
NSLog(token); → NSLog(@"%@¥n", token);
でどうかな?
- NSLog(@"%@¥n", token); にすると、
日本語フィールドも表示されるようになりました。
が、最後に余計な「A¥n」が出ます。(本当はAの上に変な記号のついた文字。これをいれると
Cocomonarが落ちるので書けない
)よくわからないのですが、エスケープされてる、
ということなのでしょうか。
NSLog(@"%@", token); にするといままで通りです。
が、
NSLog(@"%@ ", token); と、後ろに空白文字を置くとキチンと
表示されます。
文字コードが悪さをしているのは見当つくのですが、具体的にどこが
悪いのかはさっぱりです。ファイルを読み込むときも、NSDataに落としてから
エンコーディングを変えながらいろいろ試してみたのですが。
- >>367
ごめん、¥はバックスラッシュのつもりだった。
とにかくNSLogの日本語表示だけの問題だから気にしなくていいよ。
- 本当だ、¥の代わりにバックスラッシュにしたら期待道通りの結果がでました。
ありがとうございました!!
- 巨大なテキストファイルから改行コードで区切って1行ずつ読み込んで処理したいのですが、
テキストファイルをすべて読み込んでから改行コードで区切って配列に入れるとメモリを膨大に消費してしまいます。
perlっぽくファイルハンドルを取得してwhile文でeofまで回すような
ストリーミングっぽく処理したいのですがどうすればよいのでしょうか?
- 一番簡単なのはCのfgets()を使う方法。改行がLFでないと使えないけどな。
後は先読みバッファを作って、特定のサイズ分ファイルを読み込んで、そこから
改行までを取り出して、残った部分をムーブして空いた分だけファイルから
読み込み、これを繰り返す。
- >>371
ご教授ありがとうございます。
Cのfgets()関数を使ってうまくいきました。
objective-cで出来るか探してみましたがなさそうですね。
This page was generated by Dat2HTML Rev.