- 前スレが終了したみたいなので立てました。
過去ログとかよくわからないのでフォローお願いします。
- 前スレ
Cocoaはさっぱり!!! version.9
http://pc11.2ch.net/test/read.cgi/mac/1201106820/
- 間違ってても(゚ε゚)キニシナイ!!
Cocoaはさっぱり!!! version.8
http://pc11.2ch.net/test/read.cgi/mac/1179498292/
Cocoaはさっぱり!!! version.7
http://pc11.2ch.net/test/read.cgi/mac/1161486802/
Cocoaはさっぱり!!! version.6
http://pc11.2ch.net/test/read.cgi/mac/1146391229/
Cocoaはさっぱり!!! version.5
http://pc11.2ch.net/test/read.cgi/mac/1124986925/
Cocoaはさっぱり!!! version.4
http://pc11.2ch.net/test/read.cgi/mac/1091927026/
Cocoaはさっぱり!!! Version.3
http://pc5.2ch.net/test/read.cgi/mac/1063295248/
Cocoaはさっぱり!version:2
http://pc11.2ch.net/test/read.cgi/mac/1036923528/
Cocoaはさっぱり!
http://pc11.2ch.net/test/read.cgi/mac/1007632025/
- >>1
乙。
- 関連スレも貼っとこう
Macでプログラミング{8}
http://pc11.2ch.net/test/read.cgi/mac/1195385771/
MacOS XをUnixとして使ってる人の為のスレ その13
http://pc11.2ch.net/test/read.cgi/mac/1190016804/
Cocoaはさっぱり!!! version.9
http://pc11.2ch.net/test/read.cgi/mac/1201106820/
Xcode part6
http://pc11.2ch.net/test/read.cgi/mac/1201693264/
【マック】Macintoshプログラミング質問箱
http://pc11.2ch.net/test/read.cgi/tech/1113058054/
Mac OS Xでの開発環境はどれがイイ?
http://pc11.2ch.net/test/read.cgi/tech/1163314891/
- ObjectiveC++最高ぉ
- 現実
ttp://slashdot.jp/developers/article.pl?sid=08/04/06/2313251
プログラミング言語別求人件数(アメリカ)
Java 16479件
C++ 8080件
C# 7780件
JavaScript 6749件
Perl 5710件
PHP 2641件
Python 1408件
COBOL 1207件
Ruby 769件
Objective-C 38件 ←←←←
Lisp 33件
- これも関連スレに入れてあげてください
Objective-C [ObjC part:3];
http://pc11.2ch.net/test/read.cgi/tech/1186543111/
- >>7
Java がトップとは、当たり前のような、そうでないような…
- え、当たり前以外の何物でもなくね?
- そもそも今MacOSX用アプリを開発してる会社が何社あるのやら・・・。
- アメリカには一杯あるよ
日本にはほとんどないけど ...
- HMDTが募集してんじゃんw
- >>7
俺、Lispやろうかな。へたれPGの俺は求人件数よりも求人倍率の低さ
で採用されるかもしれないから。
- それってさらに
Emacs Lisp
Common Lisp
Scheme
とかに細分化されてるだろうからなぁ
一つに絞りたがっても意味ないよ
煽りじゃなく色々やった方がいいよ
得意分野として特定の言語を伸ばすのはアリだけど、特性の違う2、3の言語にまたがっといた方がいい
折角Macportsで手軽に色々入れられるんだし
- ようつべを利用したいのですが、サンプルプロジェクトによくある
GData.frameworkというのはどうすれば手に入れられるのでしょうか?
- ヒレガス本第3版今届イタ━━━━(゚∀゚)━━━━!!!!
Garbage Collection も Core Animation も載ってるね
つーか、やっぱり Leopard に対応するために、当初の予定より
出版が遅れたんだろうな‥
- そういえば、Leopardも遅れたな。
- >>17
第2版と比べて
どれくらい変わってます?
目次でいいので教えて。
- >>19
Chapter 名の変化で比較するとこんな感じ
+ 追加(第3版のみ)
- 削除(第2版のみ)
→ 変更
他は同じ
+ Memory Management
+ Target/Action
Bindings and NSController → Key-Value Coding, Key-Value Observing
+ NSArrayController
+ Basic Core Data
Responders and Keyboard Events → Keyboard Events
Working with Fonts and NSAttributedString → Drawing Text with Attributes
+ Web Services
- Creating Interface Builder Paletts
- AppleScript
+ View Swapping
+ Core Data Relationships
+ Garbage Collection
+ Core Animation
Cocoa and OpenGL → A Simple Cocoa/OpenGL Application
+ NSTask
- Creating Frameworks
- GNUstep
- >>20
ありがとう!
- ページ数も増えてるよね>第3版
- >>16
ググれ。
つーか、googleに聞け。
つーか、googleを調べろ。
- >>22
第2版 450ページ
第3版 433ページ
- >>23
Googleとは小一時間格闘して敗北したんですけど、
objective-c用?のをダウンロードできるところが無さそうでした。
(っていうか、そもそもそういうものなのかもわからず)
ソースを落としてコンパイルするのですかね?
- いや、ググったら二秒で出てくると思うが ...
http://www.google.com/search?q=GData.framework
の二つ目に
http://code.google.com/p/gdata-objectivec-client/
があるとおもうんだけど、あなたの目は節穴?
- 縦横比を維持しつつリサイズされるQTMovieViewはどのようにしたら作れるのでしょうか。
http://brpg.hp.infoseek.co.jp/qttunes/
これのメインウィンドウの左下フレームのような感じのものです。
- >>27
attributesにPreserves Aspect Ratioってチェックがあるけど。
- >>28
ありがとうございます。助かりました。
- >>27
こういうのってなんで作ってるんだろうと思う
ターゲットはいるのかな、趣味なのかな
- >>30
ゆくゆくはiTunesよりも高機能に育てる過程の一つとか。
- シンプルに連続再生して垂れ流ししたい
iTunesが重い
iTunesが扱えないフォーマットが扱える(QuickTimeで再生出来れば)
Cocoaプログラミングの勉強
などです。
- >>26
ああ、お恥ずかしい限りで。
そのページは何度も見ていたはずなのですが(^^;
なんというか、「GData.Framework」という文字ばかり探してました。
DLしてビルドしたら(エラーになりましたけど)GData.Frameworkフォルダが生成されたので
これを使えば良いのだろうと思って次に進みます。
- Foundationは思想かなにかですか?
- >>32
iTunesが扱えないフォーマット、に関してはすごく同意する
ようするに他のフリーソフトに関してもしがらみがないってある種強みだよね
- 現在、NSOutlineViewの使い方を勉強中です。
で、サンプルプロジェクトやネット上での解説ページを見ていたところ、
return (item == nil) ? YES : ([item numberOfChildren] != -1);
の様な表記をよくみかけました。
これはどのように解釈すれば良いのでしょうか。
- >>36
itemがrootなら、YESを返す。
itemが内包数0のフォルダ(num = 0)ではなく、ファイルなのでexpandしないようにする。
つーか、その質問だけではちょっと意味不明だよ。
FileSystemItemのアレについて質問しているのだろうけど。
- >>37
申し訳ありません。
ID変わったけど>36です。
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return (item == nil) ? YES : ([item numberOfChildren] != -1);
}
そして質問の仕方も抽象的でした。申し訳ありません。
仰るとおりFileSystemItemのアレなのですが、
具体的には「? YES :」の部分の解釈の仕方、ということです。
とりあえず、頂いた答えとサンプルコードを再度見返してあれこれ考えてみたのですが
return a ? b :c;
となっていた場合、aを評価した結果がYESならbを、NOならcを返す、という理解でよろしいでしょうか。
Cocoaにはあまり関係していませんでしたね。。。すいませんでした。
- >>38
> となっていた場合、aを評価した結果がYESならbを、NOならcを返す、という理解でよろしいでしょうか。
うん。
- >>38
ありがとうございました。
- >>35
wmvとかflvとか、コンテナmovにしちゃえばいいのに。
全部まとめて管理できる所に意味があると思う。
- 萩原さんの「詳解 Objective-C 2.0」
もう手に入れた人居ます?
買いなのかな?
- ttp://www.pragprog.com/screencasts/v-bdcora/creating-a-compelling-user-interface-with-core-animation
- アマゾンで、ヒレガスさん3+萩原さん2.0=9,321円、萩原さん2.0は明日到着
- >>42
>買いなのかな?
ttp://hmdt.jp/
- >>42
まだぱらぱらめくった程度だけど
おととしに出た「Objective-C Mac OS Xプログラミング」の
バージョンアップといった感じ。章の構成や内容は同じものが多いです。
前の本を持っていないなら、買って損はしないと思うよ。
- >>46
前の本も
前の前の本も
持ってるだけに
悩むな~
今日出勤前に本屋に寄って
少し眺めてから決めます。
- Cocoaと言うよりObjective-Cの質問?なのですが、いいですか?
現在Cで記述したプログラムがあります。
データの最大数は不定なので、可変でデータを保持したかったのですが、面倒だったので、
データ領域を大きめに確保して、固定長の配列として処理しています。
データは配列の番号でインデックスされ、歯抜けになっても新たなデータが来ると若い順に
埋めていきます。
ObjCに移植するにあたって、NSMutableArrayに置き換えようと思ったのですが、NSMutable
Arrayは要素が消されると自動的に配列を詰める、とのことで、配列番号での索引が利かなく
なるようです。
このような場合、データ数を可変で確保でき、且つ、配列番号での索引ができるいい方法が
ありますか?
- >>48
別に Obj-C は C の拡張なので、すでに配列で出来てる箇所を
NSArray に変える必要がないとおもうんですが ...
どうしても Cocoa にかえたければ、NSDictionary つかって、数字じゃなくて文字列でタグをつければしまいだとおもいます。
- >>48
要素を削除するときにその位置にあるオブジェクトを取り除くのでなく、
値をNSNullに変更するようにすれば、元の処理と同じようにできると思います。
元のCのコードでもNULLにするなどしていますよね?
- >>47
>持ってるだけに
>悩むな~
今日尼から届いた。1.0→2.0の変化詳しく50ページほど増量。
ま、前版もってても買いじゃね、とおもた
- >>49
折角良さげなものがあるので、固定長配列を可変長に変えたかった、というのが主な理由です。
>>50
なるほど、考えてみれば別に取り除かなくてもいいんですもんね。有り難うございました。
- >>47
10.5の新しいトピックを中心に1/3くらいまで読み進めました。
32/64bit、ガーベジコレクションで注意が必要なところなど、
細かいとこが丁寧にフォローされてる。
てゆーか、罠多すぎ>ガベコレ
・10.5以降でプログラムを書かない
・あとで買えなくても泣かない
というのでなけりゃ、買いかと。
- 名古屋大須の三洋堂で買ってきた。まだ2冊あったぞ。昨日の話だけど。
- 今Amazonから届いた
けど読む暇がない
- >あとで買えなくても泣かない
これが一番問題になるなw
- IM制御をしようとしてます。
前スレ 915 を参考にして、ターミナル上で、ことえり日本語入力時に
int main() {
TISInputSourceRef tis = TISCopyCurrentASCIICapableKeyboardInputSource();
TISSelectInputSource(tis);
CFRelease(tis);
}
を実行すると、見た目(メニューバーのとこ)は英字になるのに
いざ入力しようとすると日本語のままなんですが、
うまくいく方法ありますか?
- >>57
うちではそれでちゃんと動く気がする
(ことえり、egbridge とも)
- >>58
ども。
一旦、ターミナルを非アクティブにして、もう一度アクティブにすると
入力も英字になるんですけど...
そういう処理を入れりゃいいのか。。
- >>59
それしなくてもうちは英字入力に切り替わるけど?
日本語変換中の文字が残っている場合のこと?その状態でどうやってプログラムを走らせればいいか良くわからんけど ...
- >>60
1、ターミナル上でIM制御プログラムを走らせる。
2、cmd+spaceでひらがな入力にする。
3、「あああ」と入力
4、c-pで、コマンド履歴をだしてそっからプログラムを走らせる。
3で日本語変換中の文字が残っていても残っていなくても、
変換確定済でも未確定でも
見た目(メニューバーのとこ)は英字入力になるが、
いざ入力すると、日本語(ひらがな)が入力される。
という感じです。
10.5.2
i686-apple-darwin9-gcc-4.0.1
zsh 4.3.4 (i386-apple-darwin9.0)
- >>61
うちでは再現しないよ ... 謎。
メニューバーも英字になって、入力してもちゃんと英字になります。
ためしてみたけど、bash/zsh のちがいでもなさそう。
IM はなにをつかってる? キーボードは英語キーボードなのかな。
こちらは日本語キーボードなので。それぐらいしか違いが見当たらない。
- Interface Builder 3で、UserDefaultsと"ThreadURL"キーとWebViewの"mainFrameURL"をバインディングしたいのですが操作方法がわかりません。
WebViewのバインディングのインスペクタを見てみると、"Editable","Hidden","ToolTip"しかバインディングできる項目が無く、"mainFrameURL"をバインディングできません。
WebViewをMyClassにデリゲートして、ソースからバインディングすればどうにかなりそうな気はするのですが、InterfaceBuiderだけでする方法は無いのでしょうか。
あと、IB3では、
http://www.big.or.jp/~crane/cocoa/1100_binding/01_whats/index.html
のようにテキストフィールドとWebViewを直接つなぐことは出来なくなったのでしょうか。
- >>63
訂正
×UserDefaultsと"ThreadURL"キー
○Shared User Defaults Controllerの"ThreadURL"キー
- あるViewの上にテンプレートのようなViewを置きたいと思ってます。
下のViewは通常通り動くものが出来上がっていて、その上にImageViewをのせて
そのViewに
- (void)mouseDown:(NSEvent *)theEvent {
[[self nextResponder] mouseDown:theEvent];
}
- (void)mouseUp:(NSEvent *)theEvent {
[[self nextResponder] mouseUp:theEvent];
}
とか各種イベントをスルーするようにすれば下に行くものだと思っていたらう
まく下のViewにイベントが渡って行きませんでした。何か根本的な考え違いが
あるのでしょうか?
- superviewに渡すもんじゃない?
- 何をしたいか分からんけど、
下のviewの描画をオーバーライドすればいいんじゃね?
- (void)drawRect:(NSRect)rect {
[super drawRect:rect];
//テンプレ描画
}
- >>66 >>67
上に乗っているViewは下のViewのsubViewではありません。描画上重なっている
だけで、上のテンプレート表示は下のViewより大きくなる場合があります。
イメージのオブジェクトがいくつかあって、その上に定規のステンシルがオー
バーレイで乗っている状況です。この状態で定規は動かさず、下のオブジェク
トの操作がしたい訳です。
- >>63
う~ん、たしかにかなり変わってるね。
IB3 でも、単純に URL の中身を表示させたかったら、WebView の takeUTLfrom: というアクションを NSTextField のターゲットにしておくという方法があるけど。
- 弟がスーパーハカーを目指してるらしく、まずCから始めようと思ってるらしい
1からC言語を勉強するサイトってどこがいいかな。書籍はamazonで購入して発送待ち
目当てはMacやiPhoneで使う自作アプリだからObjective-Cをやりたいんだと思うけど
このままでは俺の3日間しかない黄金週間が潰されてしまうので助けてください
- その黄金週間までに、スーパーハカーへの道を閉ざすというのも手だ。
- >>68
ViewにとってのnextResponderはsuperViewだよ。
だから、下のViewとsubViewの関係にないなら、イベントを中継するコードを手動で書かないとダメかもね。
つまり、マウスダウンした座標から、下のどのViewの上にいるのかを計算して、そのViewのmouseDown:メソッドを直接呼び出すみたいな感じ。
- acceptsFirstResponderでNOを返すんじゃだめだっけ?
これはキーイベントだけだったかな…
- >>72
なるほど、下にオブジェクトがそこそこ沢山あるので結構複雑になりますね。
単に「イベントはスルーするけど描画はするレイヤ」を上に置きたいためだけ
なのに、、、
ウィンドウを上において[window2 setIgnoresMouseEvents:YES];しておいて
このウィンドウに描画してやるとうまく行くかと思ったけど、このウィンド
ウをクリックした瞬間に下のウィンドウが上にでてきた←あたりまえ
もう少し考えてみます。
- >>73
- (BOOL)acceptsFirstResponder {
return NO;
}
- (BOOL)becomeFirstResponder {
return NO;
}
- (BOOL)resignFirstResponder {
return NO;
}
やってみました。残念ながらオーバーレイの
- (void)mouseDown:(NSEvent *)theEvent {
に処理が飛んできました。
- おれだったら、superviewにわたして、superviewからsubviewを全部チェックして適合するviewを探すかな。
- >>62
IMはことえり
MacBook CoreDuoのUSキーボード
anthyでも試してみたけど、入力するとやっぱりひらがな。。
他にintelマシンないし、Cocoaはさっぱりなんで、AppleScriptで逃げます..
ありがとう。
- Xcode 3.1/IB3です
iTunesのように、閉じても"ウィンドウ"メニューから再び表示できるウィンドウはどのようにしたら作れるのでしょうか。
- IBで"Dispose When Close"をoff
ウインドウメニューにアイテム追加。
アクションを oderFront: とかその辺。
- OS 10.5だと、iCalは起動してなくてもDockのアイコンをカスタムにしてますがこれどうやってるんでしょう?
-[NSApplication setApplicationIconImage:]の拡張っぽいものは見つかりませんが
- NSFastEnumerationプロトコル実装させようと奮闘してるんだけど、
for ... inループの途中でbreakさせるとそのループが何度回ったかを
知る方法ってないのかな?
NSEnumerator使うと、
NSEnumerator *e = [a objectEnumerator];
x = [e nextObject];
y = [e nextObject];
for( z in e ){
. //何らかの処理
. if( xxx )
. break;
}
w = [e nextObject];
s = [e nextObject];
なんて文でもしっかり順番合うけど、なんか隠し機能でもあるのかな?
- >>79
"Dispose When Close"が見つからないのですが、Release when Closedのことで良いのでしょうか。
メニューアイテムを追加して、orderFlontにつなぐ方法は、IB2/Tigerのときは問題なく動いたのですが、IB3/Leopardでやるとアプリが起動時にフリーズします。
makeKeyandOrderFlontにつなぐと、つないだメニューは消えてしまうのですが、ウィンドウメニュー一番下のウィンドウ名の項目が閉じても残るようになります。
この方法でもウィンドウを再度開くことができることはできるのですが、ウィンドウを開いているとき、そのウィンドウを示す項目がウィンドウメニューに2つ表示されてしまうことになります。
また、閉じたときも項目がぽっかり消えてしまうのでなんか違和感があります。
- >>82
おお。それそれ。
>とアプリが起動時にフリーズします。
うちでは問題ないけどな。なんかあるのかな?
>ウィンドウメニューに2つ表示されてしまうことになります。
-[NSWindow setExcludedFromWindowsMenu:]
これ。
- >>80
Info.plist に
<key>DockExtra</key>
<string>iCalDockExtra.bundle</string>
ってあって,Dockがこれを呼び出してると思う。
- >>81
基本的にNSFastEnumerationが何回ループしたのか、ベースとなっている配列オブジェクト側で知るすべは無いように思います。
そのサンプルコードがうまく動作しているのは、NSEnumeratorをベースとしているからだと思います。
NSFastEnumerationは一気に16回ぐらいループできますが、NSEnumeratorの場合は1回づつ回してるんじゃないですかね。
特に調べた訳ではないですが。
- >>81
ttp://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_7_section_1.html#//apple_ref/doc/uid/TP30001163-CH18-SW1
For collections or enumerators that have a well-defined order―such as NSArray or NSEnumerator
instance derived from an array―the enumeration proceeds in that order, so simply counting iterations
will give you the proper index into the collection if you need it.
NSArray *array = /* assume this exists */;
NSInteger index = 0;
BOOL ok = NO;
for (id element in array) {
if (/* some test for element */) {
ok = YES;
break;
}
index++;
}
if (ok) {
NSLog(@"Test passed by element at index %d", index");
}
- >>83
ありがとうございますm(_ _)m
- File's Ownerの
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
で
[MainWindow setExcludedFromWindowsMenu: YES];
をしたところ、ウィンドウのメニュー項目が自動生成(?)されることはなくなりました。
しかし、makeKeyandOrderFrontに繋いだメニュー項目があると、ウィンドウを閉じたときエラーになります。
環境は、Mac OS 10.5.3(9D34)/Xcode 3.1(iphone_sdk_9m2173a)/Mac Book(現行モデル・竹)です。
コンソールには、以下のエラーが出力されます。
GNU gdb 6.3.50-20050815 (Apple version gdb-956) (Wed Apr 30 05:08:47 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin".プログラムは読み込まれました。
sharedlibrary apply-load-rules all
Attaching to program: `/Users/admin/Developer/ClickJapanCocoaReporter/build/Release/ClickJapanCocoaReporter.app/Contents/MacOS/ClickJapanCocoaReporter', process 54373.
(gdb)
- >>74
NSWindowのサブクラスを作って、-displayか-displayIfNeededあたりをオーバーライドすれば、Viewの再描画処理に割り込めるんじゃないかな?
もし、うまく割り込めたら、すべてのViewの再描画が完了した直後に、
[[window contentsView] lockFocus] か [NSGraphicsContext setCurrentContext: [window graphicsContext]]で
グラフィクスコンテキストを設定して、すべてのViewの上に画像を上描きできます。
手前に、ViewやWindowを重ねてる訳じゃないので、イベントを取られる事はないはず。
- >>80
http://jens.ayton.se/blag/the-mysteries-of-ical-revealed/
- >>88
gc つかってる?それなら window が解放されてしまってるんでないかと思うけど ...
- >>91
ガベージコレクション?
どのようにしたら解放しないようにできるのでしょうか…
ウィンドウの設定はこんな感じになっています。
http://wktk.vip2ch.com/vipper81014.png
- >>92
ガベージコレクションつかってると、nib のトップレベルに単においてあるオブジェクトは誰にも強く参照されてないから、GC が気が付いたとたんに削除しちゃうよ。
File's Owner の delegate にコントローラオブジェクトをつないであるなら、
さらにコントローラオブジェクトに outlet をつくってそこに window をつないでおかないといけません。
http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcEssentials.html
の nib files の項、
http://journal.mycom.co.jp/column/objc/099/index.html
のまんなかあたりとか参照。
- Release When Closedはチェック「しない」って話じゃなかったか
- >>93
[MainWindow setExcludedFromWindowsMenu: YES];
をするためにコントローラオブジェクトのアウトレットにMainWindowを繋いでいるんですが…
@interface NSApplicationDelegate : NSObject {
IBOutlet id Send2chView;
__strong IBOutlet id MainWindow;
}
ためしに__strongをつけてみましたが効果無しでした(´・ω・`)
- >91
どうだろう?
最初の5行を考えると、
主要nibファイル - NSMainNibFile -のFile's Ownerなんだと思う。
MainWindowはそのインスタンス変数。
で、[MainWindow setExcludedFromWindowsMenu: YES];でちゃんと動くってことは、
IBで MainWindowにちゃんと接続できてるんだと思うんだよね。
てことは、主要nibファイルのFile'sOwnerが解放されるってあり得ないから、
そのインスタンス変数がgcで解放されるなんてあり得ないと思うんだけど。
まあ、状況的にはMainWindowが解放されてるには違いないんだけど。
とはいっても、常人には理解不能な摩訶不思議な事をやってる可能性もあるんだよね。
ソースコード一式どかーんと見せてくれたら、みんな寄ってたかって直してくれると思うよ。
あと、
>88
それエラーじゃないから。
- >>94
orz
Release When Closedのチェックを外したらいけましたorzorz
- あう。
リロードしてから書き込むべきだった。
しかもそれ一番始めに言ったじゃん。w
- >>84,90
ありがとうございます。
まだprivateなAPIのようですね。
- PragmaticBookshelfからRubyCocoaの本出るみたいだね
びっくりした
- http://www.pragprog.com/titles/bmrc/rubycocoa
URL貼り忘れた
- >>89
これ、挑戦してみます。
とりあえず、NSFloatingWindowLevelの透明ウィンドウを作って、setIgnoresMouseEvents
したものを描画したいウィンドウに自動追従する形で実装してみました。
移動したとき付いてくるのがちょっと遅れるのが気になる、、、
- GetP2PDBクラスからCore Dataを使いたいと思っているのですが、
IBOutlet id *ADI;をFile's Ownerのデリゲートオブジェクトに接続した上、
context = [ADI managedObjectContext];
object = [NSEntityDescription insertNewObjectForEntityName:@"P2PDB" inManagedObjectContext:context];
をしたところ、
2008-06-06 18:38:38.231 Yaezakura[1703:10b] *** +[NSEntityDescription insertNewObjectForEntityName:inManagedObjectContext:]: unrecognized selector sent to class 0xa08caf40
と出てしまいます。
もともとCocoa Applicationとして作り始め、YaezakuraDelegate.mの中身だけ
CoreDataアプリケーションのデリゲートクラスのものから引っ張ってきました。applicationShouldTerminateだけはコピーしていません。
xdatamodelファイルは、File>New File…"Yaezakura.xcdatamodel"という名前で追加しました。
デリゲートクラスのソースに、xcdatamodelのファイル名を指定するところが見つからないので、もしかして、xcdatamodelのファイル名は規定されているとかでしょうか。
- とりあえず
+[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
ね。
Forが一個足りない。
補完機能を使うかコピペしましょう。
- >>104
ありがとうございます。
http://journal.mycom.co.jp/special/2005/cocoamvc/010.html
からコピってました。
確かに、For、抜けてるorz
記事より補完機能ですか…
- >>85
> ベースとなっている配列オブジェクト側で知るすべは無いように思います。
NSFastEnumerationState構造体に空きスペースは充分あるんだから
情報を入れてほしいと思う今日この頃・・・
>>86
やはりそれしかなさそうですね。
ループ周りのコードをスッキリさせたかったんですが、残念です。
- 乱暴にコード減らしてみた
NSArray *array = /* assume this exists */;
NSInteger index = [array count] -1;
for (id element in array) {
if (/* some test for element */) {
index = [array indexOfObject:element];
break;
}
}
if (index != 0) {
NSLog(@"Test passed by element at index %d", index");
}
無茶したw
実際に何回ループしたかカウントしてないしね。
- ヒレガス本第3版のPDF買ってみたけど
AdobeDigitalEditionという電子書籍ビュワー
入れないと見られないし、コピペも出来なので
$35の値段のわりに微妙だった。
- それはひどい
経験を共有してくれてありがとう
- >>106
NSFastEnumerationプロトコルを実装してる配列オブジェクト側からは、NSFastEnumerationState構造体に自由に情報を格納することができます。
問題となっているのは、そのNSFastEnumerationState構造体を他の場所から参照できないことだと思います。
- 複数のNSButtonやNSTextFieldが集まって一つの機能を持った物。仮にこれをモジュー
ルと呼びますが、このモジュールを部品として、IBで他のウインドウ上に配置でき
るようにしたいのですが、スマートにする方法ってあるでしょうか?
とりあえず今実現しているやり方はこうです:
・モジュールを表すカスタムビューを作る。モジュールを利用する側のウインドウ
上にはこのビューを配置する。
・モジュール専用のnibファイルを用意して、その中にモジュールで使用するコント
ロール類を並べ、モジュール内部のふるまいを実現するコントローラのインスタ
ンスも作っておく。
・カスタムビューは自分がロードされたら上記nibファイルをロードする。
・モジュールを利用する側はカスタムビューとだけやり取りする。モジュール内部
には触れないようにする。(モジュール用nibて使っているOutletが表に見えない
ようにする)
これでうまくは行ってますが、なんかスマートじゃない気がします。
また理想的にはモジュールのパラメータ類もIB上で設定できるようにしたい・・。
となると、究極的にはIBのプラグインを作ればいいんでしょうけど、配布したり他
のアプリで使えるようなものでもないので、それはちょっと大げさかな、と。
- >それはちょっと大げさかな、と。
面倒くさいとかやり方わからないの間違いでしょ。
あなたの実現したいものはibplugin以外の何者でもないじゃん。
- >>112
実のところibpluginも途中まで進めてましたが、ターゲットOSが
10.5以上でないとだめなようなので(今回は開発も実行も10.4)
他のやり方を探してるわけです。
「パラメータをIBで設定」なんかは無理だとしても、
複数のコントロールを一つにまとめて同じプロジェクト内で
使いまわす程度の事って、最新版のOS・・と言うほど
高度な話とは思えませんし、珍しい要求でもないですよね?
だから、今までは皆さんどうやっていたのか、
何か定番みたいな方法があるのでは?
と気になったから書いたんですが。
- >>113
じゃあ、IBPaletteでしょ?
- http://www.nitenichiryu.org/archives/2008/06/06/1340.php
微妙だなあ・・・。
- ttp://jp.techcrunch.com/archives/20080605280-north-launches-its-online-keynote-280-slides/
>AppleのiPhoneチームとiTunesチーム出身者2人が-退社してY Combinatorと手を組んで-スタートアップを始めるとどうなるか?
元Apple社員らしい。GUIアプリみたいなものを作るなら、JavaScriptよりもObjective-Cってこと?
- 俺のdel.icio.usのsubscriptionsがObjective-Jでいっぱいなんだが
- >>117
本当だ。
- Xcode3.1 ベータ6を使ったCocoa Applicationの開発をして、友人にテストのためできあがったものをビルド構成Releaseでビルドして渡したのですが、起動しないと言われてしまいました。
ここでは私のプログラムした内容は正しかった、と仮定した上で質問があります。友人の環境はPPC G4, G5で10.4のはずなので、プロジェクトの設定のディプロイメントターゲットを10.4にしたのですが、デフォルトの設定から変更しなければならない項目は他にありますか?
- コンソールに出力されたものの内容を送ってもらう。
- >>119
新規プロジェクトでCocoaApplicationを選択、「プロジェクト設定を編集」の
「すべての構成のベースSDK」で「Mac OS X 10.4」を選択、Releaseをビルド
してG4 10.4.11に持っていったら普通に起動してウィンドウが出ました。
プロジェクトの設定が悪いのか、自分のプログラムが悪いのか、それとも
ツールがβ版だからなのか、という切り分けをした方がいいと思いますけど。
- ・PPC のコードが含まれていない
・友人のマックにはないフレームワークを使っているのに
アプリに入れ忘れている
とか
- >119です。みなさんありがとうございます。
ベースSDKの設定の可能性が高いようです。今外なので確かめられませんが。
>121の方が言っているとおりもちろんそうすべきと思いますが、
自分の環境では問題なく動いていたため、
プログラミングミスはないものと仮定しました。
また、先日はベータ5を使って成功していたこと(ベータなので理由にはなりませんが)と、
私が一番自信がなかった部分がプロジェクト設定だったため
そこに絞った質問にした次第です。
細かい説明を省いてしまい申し訳ありません。
- 122さんも書いてるけど、ディプロイメントターゲットだけでなく、アーキテクチャもよく確認を。
32bit Universal Binaryね
- プログラムのミスうんぬんじゃなくてコンソール見て起動しない原因探せって意味だろうが
起動どころか開けないのなら配布する時に気付くだろうし
- ビルド構成DebugのままでReleaseにし忘れてるとかはないか
- ここで公開すればいいじゃん。
よっぽど早くけりがつくよ。
- 特定の時間になったら音を鳴らすアプリを作っているのですが
主音量を上げるメソッドってないんでしょうか?
- 勝手に音量を上げるとはウザいアプリだな。
- できるだろうけどCocoaじゃ無理じゃねーかな
- >>128
http://developer.apple.com/qa/qa2006/qa1016.html
- >119です。
>>122 すいません、書き込んだとき気付きませんでした。
結論から言うと、設定ミスとプログラミングミスでした。
アーキテクチャはあっていました。
ベースSDKの設定、もしくはアクティブSDKの設定を変更し、
それでも起動しないためログを送ってもらったところ、
setImageScaling:が悪さをしていることが判明しました。
ビルド時にエラーが出なかったため、10.4ではメソッド自体が
無視されるものと勘違いしていました。
IBとコード内のImageScalingに関連している箇所を修正したところ
無事に起動しました。
お手数おかけしました。ありがとうございました。
- >>128
#include <CoreAudio/CoreAudio.h>
void setVolume(Float32 theVolume/*0-1.0*/) {
AudioDeviceID mAudioDeviceID;
UInt32 i, numberChannels, outSize =sizeof(AudioDeviceID);
AudioBufferList *mAudioBufferList;
AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &outSize, &mAudioDeviceID);
AudioDeviceGetPropertyInfo(mAudioDeviceID, kAudioPropertyWildcardChannel, false, kAudioDevicePropertyStreamConfiguration, &outSize, NULL);
mAudioBufferList = malloc(outSize);
AudioDeviceGetProperty(mAudioDeviceID, kAudioPropertyWildcardChannel, false, kAudioDevicePropertyStreamConfiguration, &outSize, mAudioBufferList);
numberChannels = mAudioBufferList->mBuffers[0].mNumberChannels; free(mAudioBufferList);
for (i=0; i<=numberChannels; i++) {
Boolean isWritable = false;
if (noErr != AudioDeviceGetPropertyInfo(mAudioDeviceID, i, false, kAudioDevicePropertyVolumeScalar, NULL, &isWritable)) continue;
if (isWritable == FALSE) continue;
AudioDeviceSetProperty(mAudioDeviceID, NULL, i, FALSE, kAudioDevicePropertyVolumeScalar, sizeof(Float32), &theVolume);
}
}
- >130
確かにw 環境設定で制御できるようにしますw
>131
>133
できました! ありがとうございました!
- >>132
結局プログラムミスもあったのか
性格的に向いてないよ
- >>132
設定はよかったんじゃないの?
10.5以降にしかないメソッドを普通に使って、何もしてなかったということではないのかな?
- 10.6はQuickTimeに大ナタを振るのか。
こりゃ、のたれ死にするアプリが続出する予感。
- >>137
??
kwsk
- なんで開発してるのにWWDCの情報追っかけてないの?
- >>137
んなこと言って無いが。QuickTime X、理解した?
- Quicktime「X」だなんて、いかにも
過去のレガシーAPIをバッサリいきそうな感じじゃない?
- >>140
大鉈ふるうんだと理解したけど。。??
- http://hmdt.jp/archives/2008_06.html#2008061104
↑という事じゃないのか?
- いきなり旧APIが使えなくなる訳じゃないだろうね、普通。
っていうか、もうQTKitを使っているアプリならば、互換性の問題を
避けて楽にQuickTime Xが使えるようになるってことだと思う。
現状、QTKitの下のQuickTimeはレガシーAPIの固まり。QTがあんまりにも
あちこちで使われているものだから、上位Frameworkを用意してあげないと
ベースをすげ替えるのが困難だということですね。
・・・でも、QTKitって旧APIに相当する機能の大半を、今だに提供できて
いないんだが、ホントにこれですげ替え出来るのかね?
- >>144
12^2オメ
と云うのはさておき、提供出来てない部分は切り捨てられる可能性がある、と云うことでは?
まあ何がサポートされていないのかは知らないので自身は無いが。
- VR とか 3D とか MIDI とか Text とか使ってる人いるんかいな?
この辺が切り捨てられるんじゃ
- メディアスキンとかね。
MIDIとTextは需要あると思う。
- VR はアップルの製品ページのギャラリー自体に使われてるので ...
- もう今iPodぐらいしかVR使ってないんじゃん。
- でも、来年初めにリリース&切り捨てなら、
今から「作り替えてくれ」なんてアナウンスしても遅すぎじゃない?
- >>149
Apple の公式にある VR のこと?
Mac Pro,MacBook Pro,iMac,MacBook,MacBook Air
Time Capsule,AirMac Extreme,Wireless Keyboard,Mighty Mouse
iPod classic,iPod nano,iPod shuffle,iPod touch,iPhone
ざっと調べただけだけどこれらのページにはあったよ。
Mac mini と AirMac Express には無いっぽい。
あと日本のページの MacBook の VR はリンク切れになってる。
- >>151
あーあったw
iMac見たけど思わぬとこにあったわ
切り捨てはともかく、推奨しないってのはさんざん言ってきたような
移行期間は修了したってことじゃないかな
- 普通はデザインのところにあると思うよなw
- >>151
mini
http://www.apple.com/macmini/gallery/qtvr320.html
Airport Express
http://movies.apple.com/movies/us/apple/airport/airportexpress_qtvr_20080430.mov
- すみません初心者ですが質問です。
NSTableViewに自前のNSArrayの内容を表示するにはどうすればよいでしょうか。
ttp://hmdt.jp/cocoaProg/AppKit/NSTableView/NSTableView.html
の最初の例を試してみるとちゃんと表示されたため、
awakeFromNibで自前のNSArrayを作る処理を足して、
NSTableViewにsetDataSourceしてみたのですが、コンソールに
Illegal NSTableView data source
<NSArrayの内容がずらずら表示>
Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:
と実装済みなのに出てしまいます。
多分、途轍もなく初歩的な部分でつまづいているように思えるのですが、
どなたかソースを見て頂けないでしょうか。
ttp://www.uploda.org/uporg1483347.txt.html
- [tableView setDataSource:self];
ってやってみ。あと、
NSArray *datasrc;
の実体は何処にあるんだ?
とか色々妙な点があるので入門書を一冊買って読んだ方がいい。
- setDataSourceに与える引数は,
numberOfRowsInTableView:と
tableView:objectValueForTableColumn:row:
がインプリメントされてる「クラス(のインスタンス)」
じゃなかった?
- プログラマは何もする事が無い。
QuickTime Xによる最適化された再生は重いH.264等で必要な一部のみ。
QTKitの再生以外を行うAPIはLeopardと同様に動作する。
- >>156
エラーメッセージの意味が理解できました。
ありがとうございます。
>NSArray *datasrc;
>の実体は何処にあるんだ?
もうこの時点で意味が分からないので、ちょっと旅に出てきます。
現状、NSTableViewへのバインド数が画面表示分の行数を超えると、
datasrcにオブジェクトが1つしかなくなってしまって、エラーになるのも
多分この辺が原因な気もしますし。
PyObjCで作った時はあんなに簡単だったのに…orz
>>157
ということなんですね。エラーメッセージ通りの意味でした。
- なんだ。じゃぁ、Component Managerとかにがっつり手を入れてくるわけ
じゃないのか。残念。
想像するに、decompressorComponentTypeに代わる新規コンポーネント
タイプを定義して処理体系を分離するような感じか?
CoreVideo Pipelineにあうような実装変更とみた。
QT7でSoundManagerなStandardCompressionSubTypeSoundから、
CoreAudioなStandardCompressionSubTypeAudioにすげ替えたような
感じと想像。
これなら互換性は確保出来るだろうけど・・・
どうせなら、InterleavedとかInterlacedとかPlanarYUVとかの扱いにくさは
改良してほしいなぁ。
- 64bit化は、次の課題。3rd partyのcomponentの変更も必要だから。
32bitエンジンとのプロセス間通信じゃBDの再生に支障を来すから、と見た。
- >>156,157
頭を切り替えようとプロジェクトをいったん削除して、
CocoaDevやら何やらのサンプルを眺めながら、
ゼロから組み直して進めたら拍子抜けするほど簡単に出来ました。
ありがとうございました。報告まで。
- 質問です 0S10.5.3です
DivXプレイヤー2.2のコンテキストメニューからデスクトップを選択したときの様に
したいんですけど、どうすればいいですか?
こんな感じです
(1)壁紙の代わりに動画が再生されています(メニューはDivX)
(2)デスクトップに置いてあるアイコンは選択できるし、アイコンやデスクトップをクリックすれば
メニューはFinderになります、壁紙が動画になっただけのような感じです
(3)Exposeですべてのウインドウを並べると普通のウインドウのように選択できます、選択した後は(1)の状態に戻ります
自作ウインドウに対しsetLevelでkCGDesktopWindowLevelを設定すればできるかと思ったんですが無理でした
アイコンの下に描画されたがアイコン、デスクトップをクリックしたら自作ウインドウのクリックと認識される
(3)の動作でウインドウとして並ばない
このsetLevelした自作ウインドウを表示しDivXをデスクトップにしたら、DivXは自作ウインドウより前面のレベルに描画される
自作ウインドウはDivXに隠れているが、クリックイベントは受け取れる
(3)はとりあえず置いとくして、描画だけ壁紙の代わりに描画しているのか
イベントを背面のウインドウにスルーしているのかとか考えましたがどちらもやり方の検討がつきません
以上何かアドバイス、意見など頂けませんか?
DivXがcocoaかどうかは、ちょっとわかりません
- 全然Cocoaはさっぱりなスレじゃ無い件
- >>163
[windou setIgnoresMouseEvents:YES]
でどうだろう?
- LSUIElement = 1以外の方法で、
dockにアイコンを表示させなくする方法って無いですか?
メニューバーは出したいのです。
- SetSystemUIMode
- >>165
ありがとう、それでばっちりでした
- >>165
>>163じゃないけどトンクス
- インスタンスの流儀について今ひとつ無理解なものからの質問です。
あるデータを共有するためのクラスDataを作成しました。
DataをIBでインスタンスにし、
IBでインスタンスに出来る他のクラスからの参照は
他のクラスでIBOutletを作成してDataへ接続して利用しました。
良く分からないのは、IBでインスタンスにせず、
プログラム上でインスタンスにするクラスからDataへの参照方法です。
知識的にはNSNibやNSApplicationのリファレンスを読んでみても
この件に関してさっぱり糸口が見えないレベルであります。
- IBOutletでDataインスタンスの参照を持ってるクラスが
インスタンス化したやつに参照教えてあげればいいじゃん
- allocしたやつがdataを返してあげればいいじゃn
- Dataって名前だとモデルなのかな?
IBでモデルをインスタンス化するのは珍しい気がする。
- >>167
SetSystemUIModeだとメニューバーまで消えちゃいませんか?
SetSystemUIMode(kUIModeAllHidden,kUIOptionDisableAppleMenu);
SetSystemUIMode(kUIModeContentHidden,kUIOptionDisableAppleMenu);
は試してみたんですが、期待する様な動作じゃありませんでした。
- >>174
>>166メニューバーは出したくないんだろ?
- >>174
普通 Dock に出ないアプリのときはメニューバーの右側にアイコンをだすしかないと思います。
- >171
なるほど、私自身が確実に糸口(IBOutlet)つけたものが
あるのだから、そこから手繰るわけですね。
この発想はありませんでした、ありがとうございました。
>172
確かにおっしゃる通りで、例えば、ここら
http://cocoawithlove.com/2008/03/cocoa-application-startup.html
辺り等を読んでどこらへんで何がallocするのかを検討したのですが
今の私の知識では理解出来ませんでした。
引き続き調べてみます、ありがとうございました。
>173
(まだ術語的にうまく操れてる自信はありませんが)
おっしゃる通りMVCのM(モデル)の部分です。
最初、[NSApp delegate]で参照出来ないかと考えたのですが、
今の自分の知識では手法が分からず、取り敢えずその線は
あきらめて今回のIBでインスタンス化でやってみた次第であります。
流儀として珍しい系統であるとすると、今後何か支障を
来す事もあるかもしれません。他の実装方法も検討してみます。
コメントありがとうございました。
- >>175
いえ、dockのアイコンを非表示にしたいだけです。
>>174
うーん。なるほどそうですか・・・。わかりました。
- >>178
というか Dock のアイコン非表示、メニューバーだけ、というソフトにほかからどうやって切り替えるの?Dock から消したら Cmd-Tab でも切り替わらないだろうし ...
- >>179
今、親ソフトから立ち上げる子アプリをバンドルの形で作ってて、
そっちはdockに出したく無いんですよ。でもメニューバーだけは子アプリを方を表示させたいんです。
- そんな部分にこだわらなくても利用者は気にしないよ。
こういうのを「床屋のオナニー」っていうんだっけ?
- そういうのはMenuExtraみたいな形にした方がいい気がする
- >>180無駄だろ
- >>180
そんな動作するソフトって他にある?
ユーザーを混乱させるだけだとおもうけど ...
- >>180
>そっちはdockに出したく無いんですよ
184じゃないが突飛な感じがするな
もう少し晒してくれれば誰かからいいアイデアでるかも
- こういった批判の中からブレイクスルーするんですね、わかります。
- dockに出ないのなら子アプリにする必要すら無いと思うが。
- 丸ウェアを作りたいんだよ。
- 軍艦みたいだな
- >>188
やっぱりか。
- アプリのアイコンを透過にすればいいんじゃね?
- ドックに隙間が空きますよ。あと下に起動中の印の黒三角(Tiger以前)か青白点(Leopard)がでます
- 166のやりたいことはLSUIElementでできるんだけどな
もちろんそれだけじゃ駄目なんだけど
でも決定的なのは無駄だってことだな
- 色々調べてみたところ、IBでインスタンスを作成するのでなく、
シングルトンインスタンスの作成
http://developer.apple.com/jp/Documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_10.html
を利用して、今のところ期待した動作を得られているようです。
コメントしてくれた方々、ありがとうございました。
- わかった。
Finderのアイコンにすれば、どんくさいユーザーは欺けるかと。
- 最近Cocoaやり始めた初心者です・
NSStringオブジェクトからC文字列を取り出すcStringメソッドなのですが
10.4 SDKでは問題ないんですけど
10.5 SDKだとdeprecatedのワーニングがでてくるんです。
とりあえず使えるからいいんですが、これに変わるメソッドとかあるのでしょうか?
- 自己レスです
cstringを
cStringUsingEncoding:NSUTF8StringEncoding
に変えてうまくいきました。スイマセン。。
- table view のヘッダをクリックしたときに、
ソートとかせず何も反応しないようにするには
どうすればいいですか?
- ソートしないように設定、、
バインド使ってるか否かで方法が違うけど
- バインディングしてます
[tableColumn bind: toObject: withKeyPath: options:];
でバインディングを設定した後に、
[tableHeaderCell setAction: nil];
というのを入れてみましたが、相変わらずソートしてしまいます。
- AppleのサンプルコードのRoundTransparentWindowはNSWindowを透明にして
NSViewの一部分を透明にすることで、透明部分のマウスイベントがスルーされる様ですが
NSViewでOpenGLを使って描画すると
GLint opq = 0;
[openGLContext setValues:&opq forParameter:NSOpenGLCPSurfaceOpacity];
で透明にはなるんですが、透明部分でもマウスイベントがスルーされません
透明部分のマウスイベントはスルーしたいのですが
マウスイベントで透明部分かどうか判定し>>72の様に下のViewを検索して通知するしか無いでしょうか?
イメージはこんな感じで
ttp://www.watch.impress.co.jp/pc/docs/2002/0508/wwdc0141.jpg
動作はサンプルコードのRoundTransparentWindowみたいに色のついてるところだけ反応したい
- IB 2.0では、新規Nibの作成時にテンプレートの言語を選べたのですが、IB 3.0ではどこで選択できるのでしょうか。
- よく分からんが、File -> Write Class Fileで言語は選択できるな。
初心者なもんで見当違いのことを言ってたらすまん。
- 夜中12時をまたいでアプリが走っているときに、
日付が変わった瞬間を知る良い方法ってありますか?
NSTimer でひたすら時刻を取り続ければできますが、
残りの24時間の間は無駄な動作になるので、
日付が変わった瞬間に notification を受け取るようなのが
やりたいです。
- >>204
NSTimerは時間指定で呼び出す事も出来るけど。
- >>205 ㌧
NSTimer て、今までインターバル測るのにしか使ってなかった‥ orz
- runloopで時間指定って出来なかったっけ?
それ以外だと、xNix的な考え方と組み合わせるのは?
cronサービスでnotificationを飛ばすようなやつをくむとか。
シェルスクリプトからatコマンドを使うイメージ。
- Cocoaバインディングがさっぱり・・・
ややこしいなあ
- >>208
どこがわからんの?IB でバインドする変数名を指定するだけだと思うけど。
(すくなくとも第一歩は。)
- ああ、、そか、バインド先とkeyとパスを指定するくらいなんだ。。
沢山項目があるのでこんがらがってた。。
- KVOがむずかしすぐる、、、
特定のインスタンス監視して変化があったら特定のメソッド叩いて欲しいだけの
時にやらなきゃいけないことが山盛りで理解しきれてない。
NSTimerぐらい簡単に設定できればいいのに、、
- >>211
ターゲット・アクションでいいんじゃね?
- >>211
なにが難しいの?山盛りではないよね。
observeValueForKeyPath:ofObject:change:context:
を実装して、
addObserver:forKeyPath:options:context:
で登録するだけだと思うんだが...
一、二、沢山の未開民族以前の、二つの時点で沢山のひとですか?
- テキストフィールド2つだけの
cocoaバインディングのサンプルないかな
- それだけなら、なんか NSString* text; を中に持つオブジェクトをつくって、nib のなかにインスタンス化して、ふたつのテキストフィールドをそのオブジェクトの text にバインドするだけだけど ...
- 個人的に思うのだが、Bindingの動作メカニズムをちゃんと理解していないと落とし穴が結構ある。
で、ちゃんと理解するにはKVOのメカニズムを理解していなきゃならない。
それにはObserverパターンとKVCの理解が必要で、さらに言えばそもそもObj-Cの実装が分かっていた方がいい。
それはつまりオブジェクト指向言語はどうやって作るのか?ってことで、それをCで考えるくらいの力があれば…
Bindingを使いこなせるんじゃないかと思う。
っていうのは言い過ぎだとしても、「もう一段深いところ」を理解していると楽になること多いです。
- アセンブラからやり直します。。
- >>214
例えば、こんなのありますけど
ttp://www.stripe-net.jp/cocoa/documents/chapter1/chapter1-3.html
ttp://www.stripe-net.jp/cocoa/documents/chapter1/chapter1-6.html
- >218
超さんくす!!
- >>203
すみません。プログラミング言語ではなく日本語/英語/中国語などの言語です。
- interface builder3.0が糞な件について
研究室でObjective-Cを使ってプログラミングを書けって言われたんだけど、
何この糞みたいにめんどくさい開発ツールは。
なんでわざわざオブジェクトとコードのコネクションを手動で接続しなくちゃいけないわけ?
Visul Studioをちょっとは学べよ。
あんなのダブルクリックで済むんだぞ。
あーむかつく。
なんでこんなん使ってやらなあかんねん。
ふざけんな。研究費削っとんちゃうぞ!!!!!!!!!
- >>221
マルチポスト乙
厶板のObj-Cスレに返事が書いてあるからそっちをみてやってくれよ
- 慣れだ慣れ 考え方ちゃうからな
IBに限らずCocoa慣れるとMSにも言いたい事が出て来たりする
で、結局みんなEmacs+GCCに戻るのさ
ねーよ
- >>221
MVCアーキテクチャは慣れるまできついかもなぁ
ただ慣れたら離れられなくなる。
というか、俺の場合Cocoaに慣れて初めて俺のプログラムがいかにオブジェクト指向じゃなかったか気づいた。
自分のプロブラムを見直すチャンスって考え方もあるんじゃないかな
VBやったことないが基礎となる理論はしっかりしてるんだろうか。
ってスレ違いだなスマソ
- マルチポストをマルポって呼ぶスレに認定することにしました
- すいませんまた初心者なんですが。。
File's OwnerとFirst Responderってこれはなんですか?
チュートリアルでも、たまにこれに向かってコネクトしてる場面があるんですが
なんのためにやっているのかの説明が無いのでなんだかぼんやり。
- File's Owner は、nib を「開いた人」です。
MainMenu.nib は自動的に開かれて、開いた人は NSApplication (のインスタンス)になってます。
だから、MainMenu.nib の File's Owner につなぐってことは、NSApplication につなぐことになります。NSApp の delegate につなぎたいときとかにつかいます。
First Responder っていうのは、プログラム実行中にキー入力をうけつけているオブジェクトをさす抽象的なターゲットだとおもってください。
メニューバーの「文字を大きくする」メニューのターゲットを、特定のウインドウの特定のオブジェクトとかにつないでしまうと、いつもそのオブジェクトが呼ばれることになりますが、
場合場合に応じて前面のオブジェクトに命令したかったりするでしょ。
- >227
ありがとうございます!
なるほどそうだったんですか・・
cocoaアプリの構造知らぬままやってました。。
- >>227
おまいの説明はすこぶる分かり易い。
- >>229
俺も同じ事思ってた。
ID: ZbmJMWrp0 はいい人に出会えた。
- ヒレガスよりわかりやすいな
- >>227
神。説明が分かりやすい上に文体がしっくりくる。Cocoaの本書いてちょw
- もし、友達に貸したエロ本がまた貸しされて、
さらにまた貸しされて・・・
もうあなたの手で処分出来なくなった場合、
これをメモリーリークと言います。
- >>233
違うんじゃない?
- >>227
File's Ownerは、その言葉どおり、nib開いた人ではなく、オーナー(所有者)だと思います。
ADCのドキュメントによれば、MainMenu.nibを開いているのは、NSApplicationじゃないし。
まあ、たいていは、開いた人がそのままオーナーになりますが。
First Responderは、マウスでクリックされたりして、フォーカスの当たってるオブジェクトのことです。
First Responderが必ずしもキー入力を受け付ける訳ではありません。
- >>235
正確に書く事と分かり易い事とは違うわけだが。
とっかかりとしては十分な説明だと思う。
- NSTextViewの中の文字列で
たとえば2行目の左から3文字目から5文字目を
"ABC"で上書きする場合どうすればいいのでしょうか。。
- NSTextを継承してるんだから
- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString
なんかを使えばいいんじゃないの?
- >238
ありがとうございます!試してみます!
- オーナーとかの話しで思ったのですが、
MyObjectがインスタンスhogeを持っていた場合、
@interface MyObject:NSObject {
id hoge;
}
@end
@implementation MyObject
-(id)hoge {
return hoge;
}
@end
とアクセッサメソッドを用意してやることでIB上でMyObjectにバインドすることができるようになります。
これはMyObjectがhogeを持っているからですよね。
では他のオブジェクトと共有して使用されるグローバル変数の場合どうなるのでしょう。
- @interface MyObject:NSObject {
}
@end
id hoge;
@implementation MyObject
-(id)hoge {
return hoge;
}
@end
とした場合バインディングはエラーが起きてしまいました。
hogeはMyObjectが持ってるんじゃないからそりゃそうかと思いましたが、
それなら誰が持っているのでしょう。
NSApplication?NSUserDefault?File's Owner?
それぞれに無理矢理バインドしてみましたがうまくいきませんでした。
アクセッサメソッで変数を返す時にグローバル変数の値を代入してやるしかないのでしょうか?
- ああああすみません、
エラー文にセッターがないって出てたんで言われた通りにセッターつけたら解決しました。
プロパティ使っとけってことですね。試す前から書き込んだ自分が馬鹿でした。お騒がせしました。
- NSViewとかをNibに定義しないで、コードから直接
alloc&initWithFrameとかした場合、awakeFromNibは
呼び出されませんよね。
このメソッドも呼び出すべきですか?
- それって呼ばれるの?
ログ吐いて確認してみたら?
- >>243
-awakeFromNibはNib使わないんなら気にしなくておk
- >>244-245
なんか勘違いしてたみたいで、呼ぶ必要ないですね。
ありがと。
- 既存クラスにメソッド追加してやるのはカテゴリでいいですけど、
インスタンス変数を追加しようと思ったらサブクラス化しかないですか?
サブクラス化するとIB上に置いてあるControlを全部変更しないといけないのでどうにか方法はないかと考えています
- >>247
ポージング(poseAsClass)でいけるかも。
ttp://journal.mycom.co.jp/column/objc/012/index.html
- あ、ごめん。だめやった。インスタンス変数追加できないんやった。
- posingでinstance追加できたらのっとりでなんでもできちゃいそうだね。
それはそれで面白そうだけど何か問題があるからできないようになってるのかな。
- >247
漏れもちょうどいまそれ悩んでた。
とりあえずそのクラスに組み込んじゃったけど、やっぱしっくりこないや
- posingはLeopardからdeprecatedに指定されてる。
- >>247
既存クラスも自作だったら、既存クラスの名前のほうをかえて、
サブクラスのほうのなまえをもとのものにしておくという方法が。
- >>252
知らなかった。すでに64ビットアプリだとサポートされてないし。
- 中継クラスみたいなものを用意するってのは駄目なの?
setter と getter を書いて中継するとか。
あと、Bindingにしておけば、selectionが中継クラスになるから、
実際のターゲットクラスが変更になってもnibの変更は最小限ですむよ。
- >>254
でもいろいろと別の runtime 関数が用意されてて、class の乗っ取り自体は 64 bit でも自在にできるよ。
- 特にプラグインは危険だな。アプリ上の任意のクラスを簡単に乗っ取れるから。
自分で作ったプログラム用のプラグインを使ってブルートフォースアタックを
かけたら簡単にシリアル番号をボロボロ抜き出せた。笑うしかないね。
- まあこの辺がiPhone SDKでダウンローダブルなプラグイン禁止の理由なんだろうね。
FireFoxが移植出来ない、一番の原因。相変わらずCNETは表面的だ。
http://japan.cnet.com/news/media/story/0,2000056023,20376076,00.htm
- >>247
バインディングの実装と同じように手段を取ってみては?
バインディングした場合、NSView側でバインド先のオブジェクトとキーパスの情報を保存しなければならない。
でも、MacOSX10.3でバインドが追加されたとき、NSViewにインスタンス変数が増えたりはしなかった。
たぶんNSBinderというヘルパークラスが、NSViewに代わって、その辺の情報を保存してるっぽい。
- >>259
あれってポージングで実装してるんじゃなかったの?
- いろいろと意見ありがとうございます。
poseAsClassが10.5でdeprecatedになって、木下さんがどこかの記事で代替えの方法を解説してたと思うのですが。
>>259
バインドを使用すると結局たくさん線をつなぐことになりそうなのでスマートではなさそうな気がします、、。
- ポージングの代わりはメソッド交換でってアップルが言ってた。
- >> 261
いや。バインドを使うんじゃなくて、バインドと同じ仕組みを応用すると言っています。
ところで、ポージングって、インスタンス変数の追加はできるの?
ttp://journal.mycom.co.jp/column/objc/012/index.html
- ポージングでは無理そうです。
>>259を読んでおっしゃることは理解しました。
- >>264
いちおう、詳しく説明すると。
まず、カテゴリー使ってNSViewにgetterとsetterを追加する。
- (id)hoge{ return [Helper getValueWithOwner:self]; }
- (void)setHoge:(id)value { [Helper setValue:value withOwner:self]; }
で、Helperクラス側に値を格納する。
static NSMutableDictionary* dict;
+ (id)getValueWithOwner:(id)owner{ return [dict valueForKey:owner]; }
+ (void)setValue:(id)value withOwner:(id)owner { [dict setValue:value forKey:owner]; }
こんな感じ。
- >>262
MethodReplacementってやつか。
- MethodReplacement
http://developer.apple.com/samplecode/MethodReplacement/listing3.html
その他のMethod Swizzling
http://www.cocoadev.com/index.pl?MethodSwizzling
http://rentzsch.com/trac/wiki/JRSwizzle
- メソッドの+と-って何ですか?
- クラスメソッドとインスタンスメソッド
- クラス名 *A = [クラス名 xxx]; でインスタンスを作れるのが、 +
それ以外が -
であってるかな?
- >>268,270
頼むからObjective-C Programing Languageぐらい読んでからCocoaプログラミング始めてくれ。
今は日本語版もあるんだから。
- むしろ頼むからプログラミング始めないでくれ
- むしろ神解説できたらいいのにね
分かりやすい解説シリーズキボン
- クラスとインスタンスってのはプッチ○プリンの入れ物と...
めんどくせ。
- クラス=風俗
インスタンス=風俗嬢
- そういう方向で言うとアレか。
クラスメソッド:
デリヘル ヘルス嬢 = [デリヘル 呼び出し];
インスタンスメソッド:
[ヘルス嬢 xxx];
- ゆとりのためにゲームで説明すると
ソルジャーから派生して枝分かれしたナイト、ウィッチ、プリーストといったジョブ(クラス)のキャラ達(インスタンス達)がいたとして、
10人ぐらいのパーティだと複数人同じジョブ(クラス)の人がいるんだけど
それぞれが持ってる、戦う、防御、逃げるなんかの戦闘コマンド(インスタンスメソッド)はもとのジョブ(親クラス)から継承したコマンドで、
ウィッチのサンダーとかファイア、プリーストのヒーリングなんかはジョブ固有のコマンド(インスタンスメソッド)なわけ。
んで特殊アイテム戦いのドラムを使ってナイト全員が2回行動になったりするのがナイトのジョブコマンド(クラスメソッド)、
前衛後衛入れ替えとかで全員場所入れ替えすんのがソルジャーのジョブコマンド(親クラスのクラスメソッド)。
- あー、これだとクラスメソッドについて正しく説明できてないな、、
- TOとFFとDQが混じってる…?
- インスタンスメソッド:
[ヘルス嬢 チェンジ]; // raise Exception if call 3 times.
こうですか><
分かりません><
- オウガバトルベースのつもりが混じってますね、、
上の流れだとalloc系のクラスメソッドをどう説明すれば良いか
- そもそも、クラスもインスタンスも、メッセージを受け取れる「オブジェクト」であるという点では違いはないんだ。
しかし例えば画面上の無数のウインドウがあったとき、それらは全て別々のオブジェクトであるのだが、
その動作を規定しているのは共通のコードなわけだ。それが「クラス」。
対してウインドウの位置や中身などは全て別物だ。その情報を保持するのが「インスタンス」。
よくタイヤキの型(クラス)とタイヤキ(インスタンス)に例えられるな。型はおなじでも出来たタイヤキの中身は変えられる。
俺はクラスはイデアだと思ってるけど。
じゃあ動作を規定すると言ったけど、ウインドウにメッセージを送るときそれを受け取るのはインスタンスだ。
インスタンスが受け取るメッセージ(に対する動作)を規定するのが「インスタンスメソッド」だ。
クラスもオブジェクトである以上、クラスが受け取るメッセージもある。それを規定するのは「クラスメソッド」になる。
で、これを実際にObj-Cで書くときには、クラスメソッドの定義には「+」、インスタンスメソッドの定義には「-」をつけてる。
クラスメソッドの用途は確かにそのクラスのインスタンスを作るものが多い。allocを始めとして。
ただしそれに限るものでもない。全インスタンスに共通な性質を設定するアクセサだって作れるし。
- ちなみに、クラスとインスタンスはどちらもオブジェクトである…んだが、Obj-Cの場合はさらにこう言える。
「クラスオブジェクトはNSObjectクラスのインスタンスとして扱える」
つまり例えば、クラスをNSArrayにつっこむということは普通に出来る。ていうか俺もやる。例えば
[anMutableArray addObject:[NSString class]];
とするとNSStringクラスがオブジェクトとしてanMutableArrayに追加される。
ということで、-と+、インスタンスメソッドとクラスメソッドは
一つのファイルの中で2種類のオブジェクトの動作を定義する必要があるから、存在するとも言える。
- すげええクラスとかまんまArrayに入れたりできるんですか!
ちなみにどういった用途で使うんでしょう?
便利な使い方が想像できないです、、
- クラスで
外部から呼べるのが-
内部でしか呼ばないのが+
という理解でよろしいですか?
- >>284
コンパイル時にはどういうクラスを何個使うか分からないとき…かな。別にNSArrayに限らず、NSDictionaryでもいいし
Class型やid型に入れてもいい。
>>285
内部と外部の意味がよく分からん。
[[NSString alloc] init]; のallocはクラスメソッドで、initはインスタンスメソッドだが、この文に内部も外部もないだろ。
どちらもオブジェクトにメッセージを送っているにすぎない。呼べる呼べないで言えば、
[NSString init]はできないしNSString *aStringに対して[aString alloc]はできない。それだけ。
- ってNSStringクラスはNSObjectのインスタンスとしても扱える訳だから、[NSString init]は呼べるか。
多分意味はないし、実際に試したことはないけど。
- >>285
クラスとインスタンスの関係は理解してる?
クラスって云うのは、いわば機械の設計図みた様なもので、材料とかその分量とか作る手順が書かれてる。インスタンスはその設計図を基に作った現物。
でまあ、+がついてるの = クラスメソッド が レシピについての操作。材料の分量を変更するとか、材料を準備するのもこれに入ってる。
要は、クラスに対する操作な。
で、現物を使ってテレビ点けたり、部屋冷やしたりする様な作業が-のついたインスタンスメソッド。例外的に用意した材料を加工するのもこれに当たる。
例えば、まあこんな感じかな。
// 疑似コード
パイ' = [パイのレシピ 材料の準備]
パイ = [パイ' 調理]
ここで、『材料の準備』はレシピについて行われてるから、クラスメソッドの呼出し。で、この後の調理は材料=ほぼ現物に対して行われてるから、インスタンスメソッド。一々こうかいてるのは面倒だから、
パイ = [[パイのレシピ 材料の準備] 調理]
みたいな感じで呼べる。
……こんな感じでおk?
- >>283, >>287
classはid型だけど、NSObjectのサブクラスとかじゃないよ。
- ここの盛り上がりに比べてiPhoneアプリ製作スレの中身の無さといったら
- デリヘル嬢と本番するにはどんなメソッドを呼んだらいいの?
- >>291
[[デルヘル嬢 alloc] init]
- release
- デリヘル嬢 デリ嬢 = [[デリヘル嬢 new] retain];
[デリ嬢 setMoney:1万];
[self setSkin:[Skin skin]];
[デリ嬢 play:self];
[self 射精];
[デリ嬢 release];
書いてて死にたくなってきたわ
以後建設的な話しを
- 処理中にキャンセルボタンでキャンセルさせたいのですが、
どうすればよいのですか?
処理はfor文とかで回してるのですが。
- >>289
失礼。正確には、
「NSObjectのサブクラスのクラスオブジェクトは、NSObjectのインスタンスメソッドを持つとして扱える」かな。
えーと例えば、
[NSString isKindOfClass:[NSObject class]] とするとYESが返ってくる。
クラスオブジェクトに対してrespondsToSelector:やperformSelector:が効くのもこのおかげだと思う。
- メタクラス等はこれがわかりやすいよ
http://journal.mycom.co.jp/column/objc/016/index.html
http://journal.mycom.co.jp/photo/column/objc/016/images/MetaAndSuperl.jpg
- >>295
ボタンが押されたforループから抜ければいいじゃん
- ループを別スレッドに分ける。
- >>294
leakしてる
- 使用後のゴムが小学校の校庭に落ちていたのを思い出した。
ちゃんと処分しろよな。
- AVMovie* movie = [[AVLibrary sharedLibrary] objectForKey:@"InranJoshiKose"];
[self watchMovie:movie];
[self playWith:self];
[[AVLibrary sharedLibrary] removeObjectForKey:@"InranJoshiKose"];
[self sleep];
- >>295
forループでなくて、runLoopにて処理させるってのもある。
performSelector:withObject:afterDelay:を待ち0で指定。
次のrunloopで動く。
これだと、ループのなかでGUIの更新とかイベント処理とか
全部出来るからべんりだお
- CoreAnimationで明示的なアニメーションをさせているのですが
アニメーションが終了するとレイヤーが開始時の状態に戻ってしまいます。
終了時の状態をキープさせるにはどうすれば良いのでしょうか?
- 自己レスです
CABasicAnimation* animation;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
でいけました。kCAFillModeForwardsが何なのかよく分かっていませんが。
- NSTextViewを2つ左右に配置して、改行数も同じなテキストを表示してるんですが
この2つのTextViewの垂直スクロールを同期(ホイール、スクロールバー操作時)させるにはどうしたらいいのでしょうか。。
- >>306
NSScroller用のValueを誰かに持たせて両方にbindする。
と、何も試さずに言ってみる。
- >>306
ドキュメントで SynchroScroll を「全文検索」する。
- すみません。
2つのNSSplitViewで片方のNSSplitViewのディバイダーを動かした時に
もう片方のNSSplitViewのディバイダーをシンクロさせる方法はありますでしょうか?
- HMDTの2nd読んでるんだけど
cocoaバインディングのとこで
バインディング用のNSObjectControllerにある "content"というアウトレット
これってIndentify Inspectorにはでてこないんですが
(Connectionsにはでてくる)
具体的になにをやってるんでしょうか??
- これってIndentify Inspectorにはでてこないんですが
↓
でてきてます。
すいません勘違い。。
- Cocoaセミナーの資料、Leoaprd対応前のヤツどこかで入手できないでしょうか?
もしくは誰かどこかにアップして頂けると嬉しいのですが・・・
中級編と上級編を
- >>312
あきらめてレパードをかいましょう。1万円の投資はいみがあります。
なるべくAppleの提供しているとおりするのが混乱が起きなくて良いです。
Apple はどんどん過去を切り捨てる会社だからプログラムしようとおもったら仕方がないです。
- Leoaprd使ってるんですが都合上、メイン環境はまだDeveloperTools2.5なんで...
で、自己解決ですが色々ググってたらありました。
http://hmdt-web.net/Cocoa/
- それはすいません。どういう都合なのか興味深いんですが。
- >>314じゃないが、自分もメイン環境はTiger。
仕事で使うアプリがTiger用…っていうかLeopardに移行して余計なトラブルを起こしたくない
といった都合。
- 僕も仕事とか、トラブルを避けたいってのがあります。
それと、自分の知識が、まだ段階的に、OS 10.3~10.4の新しいAPI勉強中、というぐらいなので
(そんなんで仕事すんなって話ですが)、Xcode3への移行も含めた10.5の勉強は後回しにしたいのです。
- >>317
なるほど。でも XCode 3.1 (iPhone SDK についてるやつ)は全然機能豊富でいいよ。XCode でも Tiger 用のソフト作れるから、XCode だけは 3.1 にしてもいいんじゃないかな...
まあ Interface Builder の仕組みとかわかってないと、見た目が案外変わってるから混乱するかもしれないけど。
- CoreAnimationについて質問です。
CoreAnimationを使うと位置や不透明度を指定するだけで中間フレームが補完されますが
アニメーションさせずに位置などを変更する方法は無いのでしょうか?
- >>319
コードを共通にしたいなら、Durationを0にするのが簡単。
- CoreAnimation使わなきゃいいだろw
なんのためのAnimation機能だよ
- 自己解決。トランザクション設定でいけました。
>CoreAnimation使わなきゃいいだろw
>なんのためのAnimation機能だよ
一瞬だけ無効にしたい事は結構あると思うけど。
- age
- 思いっ切り余談なんだけど、新し物好きとか見てると、
なんか3日に1回は0.1バージョンアップしてトップページに
載せて貰って、DLを稼ごうとしてるアプリがない?
いやまあ、別にいいんだけどさ。
新し物好きの人とか大変そうだなあと。
- 新し物好きの人はどうでもいいんだが、
あまり改良点が少ないと、わざわざダウンロードしてくれた人に申し訳ない。
自分なら改良点が5個くらい溜まるまで+0.1は控えるな。
そうすると新バージョンの公開は大体1年に2回くらいになる。
バグフィックスは1個だけでも+0.0.1するけどな。
- >>324
新し物好きの人はそれで稼いでるんだからいいんじゃない?
ユーザーとしてはバージョンアップ歓迎だし。
- ソフトのとこクリックすると
新しもの好きにお金がはいるシステムだったんだ?
- 直リンだし別に金は入らないかと。
- バナー掲載料
- 現在のマウスポインタがビュー内の特定の領域内にあるかどうかを判定したいんですが
QuickDrawでいうところのRegionはCocoaではなんと呼ぶんでしょうか?
- 知らん
NSMouseInRectでググれ
- >>330
俺も昔は気になってたが、不定形はNSBezierPath使って判定してる
CGRegionだっけ?そんなのもあったような
- >>332
なるほど、NSBezierPathで領域を作って、containsPointで判断すればいいんですね
ありがとうございました
- sage禁止
- NSString で、例えば "2ch" みたいに、ダブルクォーテーション付きで
文字を表示させたいときは、
NSString * string = @"( ? )";
で、 ( ? ) のところにどう記述すればいいでしょうか。
- @" ¥" ¥" "
というふうにバックスラッシュ ¥ をつけます。
2ch に書き込むとバックスラッシュと円記号がごっちゃになる気がするけど ...
- やっぱり円記号になった ...
XCode で日本語キーボードなら、Opt-円記号でやるとでる、/ と傾きが反対向きのスラッシュをつかってください。
- >>336=337
できました!
ありがとう
- まめ知識
NSString *AAA = @"aa";
NSString *BBB = AA @"bb";
とかくと、コンパイラで自動で結合されて
NSString *BBB = @"aabb";
と同義になる
- >>339
> NSString *BBB = AA @"bb";
AAA@"bb";
かな?
- 間にスペースとか改行とかを入れると、ばしっとつながる。
(コンパイラでの接続なので定数オブジェクトに限られるけど)
NSString *strings = @"aaaa¥n"
@"bbbb¥n" @"cccc¥n";
#define SomeString @"index.htm"
NSString *TheURL = @"http:/aaa.com/" SomeString @"#anchor";
みたいな感じで、定義分と組み合わせると、条件によって文字を交換とかできる。
- へえ、知らなかった。
面白いね、ありがとう。
- age
- Cの文字列リテラル連結と同じ要領だな
- iCalみたいに、起動してないアプリのアイコンを書き換えるにはどうすればいいんですか?
- [[NSWorkSpace sharedWorkspace] setIcon: SomeIcon forFile: fullPath options: nil];
とかでファイルのアイコンを書き換える。みたいなのかな
- >>345
>>90
- HMDT 3rd 本を読んでいるところです。
core data のサンプルで、3ペインのMailアプリケーションのようなサンプルがあります。
左のテーブルにMailbox、右上のテーブルにMailboxに含まれるMailのリスト、その下にメールの内容が表示されるものです。
このサンプルを使って、Mailboxを作成、Mailを複数追加。
その後、Mailをリストから削除すると、
~/LIbrary/Application Support/Mail/Mail.xml
の中に削除したMailの部分だけ残るようになってしまいます。
Mailboxごと削除してもその部分だけ残ります。
自分でデータ削除用のコードを書かなければならないのでしょうか?
それとも設定をミスってる?
環境は、Tiger + Xcode2.5 です。
ヒントだけでもお願いします。
- >自分でデータ削除用のコードを書かなければならないのでしょうか?
うん。というかハードディスク余ってるんだから、別に消さなくても ...
- >の中に削除したMailの部分だけ残るようになってしまいます。
削除していないMailは消えてるの??
コアデータは(デフオだと)アプリを終了しないとXMLに書き込まれないよ。
あと、削除といってもフラグを立ててるだけかもしれないし。
- ありがとうございます。
>>349 さん
追加と削除を繰り返すだけでデータが増えていないのに、ファイルサイズが大きくなっていくのが気持ち悪かったので...
>>350 さん
>削除していないMailは消えてるの??
書き方が分かりにくかったでしょうか。
削除したMailがxmlファイルにはずっと残ってしまうという状態です。
例えば
アプリを起動 > Mailboxを1つ作成 > Mailを2件登録 > Mailを1件削除 > Mailboxを削除 > アプリ終了
で、確認すると削除したMailだけ残っています。
上の例で、Mailboxを削除しなければ、MailboxとMail2件が残っています。
削除ボタンはMail用のArrayControllerのremoveアクションに繋がっています。
Mailboxを削除するボタンもMailbox用ArrayControllerのremoveアクションに繋がってますが、Mailboxは追加や削除を繰り返してもきちんと削除されます。
- >>351
見当違いかもしれないけれど、MailboxのrelationshipからだけMailを削除しているだけではないですか?
Deletes Objects on Remove オプションはどうなっていますか?
- >>351 さん
ありがとうございます。
Deletes Objects on Remove オプションがOFFになってました。
ONにすれば削除されますね。
お恥ずかしい限りです...
と言う事で解決致しました。
レス頂いた皆様、ありがとうございました。
- アンカー間違えました。
351でなく >>352 です。
- そういや、気がついたらxibになってたけど、awakeFromXibにはならないのか。
- xibはビルドするとnibになるよ。
- awakeFromDeb
- 何でもかんでも初期処理をawakeFromNibに書いて特に不具合もないのですが、
initWithなんたらに書いた方がいいんですかね?
昔はawakeFromNibがなかったからinitWithなんたらで書いてた、
なんて記事を見た記憶もあるのですが。
- >>358
initWith... は nib から目覚めたときには呼ばれないよ。
initWith... は IB でオブジェクトをつくったときに呼ばれていることになってる。
nib につくっておいてない、自分でプログラム内でつくるオブジェクトは initWith を alloc] initWIth... ] でつくりますが。
- >>358
ここらが落とし穴らしい。
http://www013.upp.so-net.ne.jp/tanken/Tanken/no4_PitfallOfNib.html
- そうそう、awakeFromNibはクラスの実装内容によっては複数回呼ばれるんだよね
- >>358
Viewだとnibに置いた場合はinitWithCoder:が呼ばれる。
俺はnib以外で使う場合も考えて、共通の初期化メソッドを作っておいてinitWithFrame:とinitWithCoder:から呼んでる。
アウトレットを使って何かする必要があるときはawakeFromNibも使う。
- 便乗して質問
initWithCoder で渡される coder って、具体的に何で、
誰から渡されてるんでしょうか。
デカいデータを必要になったときだけ読み込みたくて、
initWithCoder の中でそのデータだけは decode せず、
後から明示的に decode させるようにしたいんですが。
- >>363
「Archives and Serializations Programming Guide for Cocoa」を読むと分かると思う。
ただしでかいデータを遅延読み込みなんてのはそもそもcoderに頼むべきことじゃない。
何故ならcoderがどうやって、どんな形式でファイルを保存しているかを気にしなくていいのがこの方式の利点だから。
やるとしたら、そのでかいデータは別のオブジェクトにして、そのキーだけを保存すればいい。
ファイルに保存したいなら、別ファイルにするか、バンドルを使えばいい。
- Youtube APIを使用してYoutube Player/Downloaderを作成しているのですが、
ダウンロード機能のAPIはなく、サイトページを受信してリンクの文字列を抜き出して
うんぬんしか方法はないのでしょうか?
抜き出しスクリプトを探すとperl、php、pythonのスクリプトはあるのですが、
objective-cで処理してるのがなさそうです。(正規表現が弱いからできないのかな?)
- まあ正規表現使わなくても NSScanner でごにょごにょやれば出来ると思いますが。面倒だけど。
NSTask で perl かなんか呼んだほうがかんたんかも。
- NSXML関連は?
- 基本的な質問です
CocoaはRPGのようなゲームを作るのに向いていますか?
Macでゲーム開発するのはObj-Cでokでしょうか?
- >>368
Core AnimationとかOpenGLとかも使えるしObj-Cでおk
- >>368
そのゲームのスペックや内容にもよりますが、Cocoaはゲーム用のフレームワークじゃないからね。
Cocoaを使わないなら、ObjCを使うメリット半減って感じがするし。
もし、パフォーマンスを追求することになるなら、逆にObjCは不向きな気もします。
- アドバイスありがとうございます
RPGツクールをやっていてちょっと高度な事がやってみたくなった
程度のものですので、内容としてはまったく低レベルなものです
ドラクエみたいなのをイメージしています。他に同じような事をやってる方のサイトでも
あれば良いのですが、内容なのでまずは全体像をつかむ所から勉強してみようと思います
- >>371
ttp://www1.odn.ne.jp/horiguchi/SoftWare.html
- ゲームをつくるときは OpenGL でやるのが普通なんじゃないでしょうか。
でも、そもそもゲームの画面を表示するウインドウを表示したりとかいうあたりは
Obj-C と Cocoa でやらないといけないと思います。
(まあ Carbon +C でやってもいいけど、資料も少ないし、かえって大変だとおもう)
- アクションゲームには不向きだと思うけど、CoreAnimationってそれなりにゲームに使えそうな気がするんだよね。特に、ビジュアルノベルゲームとか。Core Animationのサンプルにカードゲームはあった気がする。
- >>370
まぁ、同じオブジェクトに同じメソッドを繰り返し呼ぶ場合には、
MethodForSelectorで関数ポインタを取得してそこから呼び出せば
速度が向上したりする。メソッドではなく関数で処理したらいい部分とかは
関数で組んでやるといいのかもね。
- Pangeaがゲーム開発者向けのプログラミングガイドを公開してる。
あんまCocoaって感じじゃないけど
ttp://www.pangeasoft.net/book/index.html
- Obj-CはCも混ぜて書けるんだから、速度出したいところではどうにでもなるだろう。
- Cocoa / Objective-C がゲームに不向きとは思えません。
Doom が NEXTSTEP で開発されたことを思い出して欲しいです。
むしろ今の環境の方がマシンパワーが上がっていて有利に思えます。
- >>365
>>366の言うようにNSTaskからLL言語を呼ぶのは楽でいいと思う。
俺も自分用の手抜きアプリとかは基本的な処理はRubyに投げてる。
正規表現なら個人的にcocoaonigurumaがおすすめ。
http://limechat.net/cocoaoniguruma/index_ja.html
- あと有名どころでは OgreKit ってのがあるよな。
http://www8.ocn.ne.jp/~sonoisa/OgreKit/
あとはRegexKit/Regex Kit Lite とか。
- CoreMIDIをつかったアプリケーションのプログラミングをしたいのですが、何か良い参考資料はないでしょうか
ADCの中を見ていても、CoreAudio関連の詳細な資料が見つけられないので困っています
とりあえず、当面の目標は、システムエクスクルージブなどのMIDIデータをMIDIに流すだけのプログラムで
外部MIDI音源の音色エディットなどに使えるものを作ろうとしているのですが
MIDIエンドポイントにデータを渡す方法からして、どこをどう調べれば良いのかわかりません
環境はMacOS X 10.4.11,Xcode2.5です
ちなみに、私自身のプログラミングスキルは、大学時代にC言語のコンソールアプリケーションをいくつか作った事がある程度で
オブジェクト指向プログラミングは先週始めたばかりです
古本屋で見つけたXcode2入門という本で一通りXcodeとInterfaceBuilderの使い方は覚えました
- >>381
ttp://www.stripe-net.jp/cocoa/products/midiwind2/index.html
ここに、MIDIプレイヤーのソースコードがあるよ。
- >>382
ありがとうございます
読んでみます
- つ ttp://chiba.cool.ne.jp/exprism/other/coreaudio_doc/music_player/music_player_file1.html
- 質問です。
SDKのOpenGLのサンプル
/Developer/Examples/OpenGL/Cocoa/CocoaGL
で、C++のコードを追加しようと思い、
Foo.cpp, Foo.h
を追加して、
空のクラスを追加したのですが、コンパイルエラーが2000個近く出てしまいました。
どういう原因が考えられるでしょうか。
新規プロジェクトでCocoaアプリケーションやiPhoneのプロジェクトを作成した場合は、同様の事がうまくいくのですが・・・。
- あまり詳しくは分からないけれども…
こういうのが参考になれば。
ttp://developer.apple.com/documentation/MusicAudio/Reference/CACoreMIDIRef/MIDIServices/CompositePage.html
ttp://chiba.cool.ne.jp/exprism/other/coreaudio_doc/midi_notifications/midi_notifications.html
ttp://ameblo.jp/nowhere-land/page-4.html
- >>385
コンパイルエラーの内容が少しでも分からないと、何もアドバイスできないのだが。
- >>385
根本的な解決にならんかもしれんが拡張子をcppからmmに変える
- >>385
C++のコードを追加したとあるけれど、新しくクラスを追加という事は
ココアのクラスの中にC++のコードを組み込んだという事でしょうか。
もしそうであるなら、拡張子をmにしてみるとか。
- みなさん、レスありがとうございます。
>>387さん
ごもっともです。すみません。ただ、2000個近くあるので、どれをどう説明すればいいか・・・
>>388さん
試してみます。ただ、マルチプラットフォームにしたいコードをC++で書いていて、それをCocoaから利用したいという想定なので・・・。
>>389さん
いえ、単に.cppと.hをプロジェクトに追加しただけです。Cocoaのクラスに直接干渉させるようなことはしていません。
追加した.cppをビルドの対象から外すと、問題なくビルドが通ります。
- ビルドのオプションじゃない
- >385
新規ファイル追加でtest.pchを作る
test.pch
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
ビルドオプションの
GCC4.0 languageの項目
Prefix Headerの項目をダブルクリックして入力されているのを削除し
test.pchを入力する
で、ビルドする
書いてて内容が良くわかってないから
Developerからコピーしてからやってみて
- >ごもっともです。すみません。ただ、2000個近くあるので、どれをどう説明すればいいか・・・
まずいちばん最初から5つぐらいのエラーを教えてください。
後ろのほうのエラーは単に前のほうのエラーでコンパイラが混乱して
変なことをいってるだけのことが多いです。
- サンプルコードのPrefix Headerに$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h
が書いてあってcppファイルの時でもObjective-cのコードが関係してきてコンパイルエラーが出てるっぽい
そのパスを削除するだけでビルドできる様になったが、Prefix Headerはコンパイル時間を高速化するだけで
無くても問題なし?
- 「全角で書いてました」とかだったら大笑い
- >>393
たんにC++コードに誤りがあるってことはないよね?
- >>394
>無くても問題なし?
なし。というかエラーがでなくなることがまずは重要。
もしその推測が正しいなら、ビルドの設定でコンパイラのデフォルトの言語を
Objective-C++にしてもいいかもしれない。
- 手元にXcodeの2.5しかないんだけど、3.0には「Objective-CでC++デフォルトコンストラクタ/デストラクタを呼び出す」は
あったっけ?これにチェックが入ってないとC++のコードで大量にエラーが出ると思うんだけど。
- 3.1で Info パネルにそれに相当する項目があからさまにあるかは知らないけど、
何にせよ -fobjc-call-cxx-cdtors を指定すればいいです。
あと、べつにそのオプションをチェックしなくても、C++の文脈で
default constructor / destructor が呼ばれなくなるわけじゃなくて、
そのオプションは、Obj-C のクラス内にメンバ変数として
C++ のクラスのインスタンスを置いたときに、
alloc init 時にそれらのコンストラクタを
呼ばせるためのオプションなので、滅多に関係ない気がします。
というか @class 内に C++ のクラスのポインタで無いインスタンスを置くなと。
- さっき書き込んだのに反映されなかったのでもう一回。
NSTableViewで選択されたアイテムを表示する時に、
ハイライトじゃなくて下線で提示してあげるようにしたいんですが、
どうしたらいいでしょうか?
具体例あげるとこんな感じです。
ttp://www.h5.dion.ne.jp/~akt/afxss/afxss_b1.png
(現在選択されているアイテムが下線、選択済みアイテムがハイライトされてるやつ)
- 似たようなプログラムを組んだ事がある。確か…
NSTableViewのサブクラスを作って、
- (void)drawRect:(NSRect)frameRect;
をオーバーライド。選択しているときに下線を引くようにする感じだったかな。
選択しているときのデフォルトの色が反映されたりちょっと苦労した記憶あり。
- >>392さん
>>394さん
ご指示の方法でこちらでもうまく行きました。ありがとうございます!
その他の方々も、助けていただいてどうもありがとうございました。
精進します。
- >> 401
オプションとかで切り替えられるわけじゃなくて、
ハイライトさせてるメソッドをオーバーライドして、
そこで自分でセルの内部にdrawLine()するんですね。
助かりました。どうもありがとうございます。
- 提示してあげるようにしたい
- Xcode 3.1です。
ツールバーのデリゲートで、
- (NSArray *) toolbarDefaultItemIdentifiers : (NSToolbar *) toolbar {
return [ NSArray arrayWithObjects :
NSToolbarPrintItemIdentifier,
NSToolbarPrintItemIdentifier,
nil
];
}
と設定しているにも関わらず、デフォルトセットに"カスタマイズ"等のツールバー項目が表示されてしまうのですが、なにか他に設定すべき箇所があるのでしょうか。
http://wktk.vip2ch.com/vipper91279.png
- >>405
もう3.1の話をしても良いんだっけ?
- 3.1はリリースされてる
- >>405
IBで何か設定していませんか?
delegateで設定したものと、IBで設定したものの和が表示されますよ。
- >>408
NSToolbarのインスタンスはIBにて作成しています。
どこに設定があるのでしょうか…
- NSToolbarはIB使わず作った方がいいのかな…
もう限界orz
- IBでもとから入っていたNSToolbarItemをいったん抹消した後LibraryからD&Dしたら解決しました。
なんだろこの仕様…
3時間の苦労…
- たまにタコな動きするからクリーンとかIBを手動で保存とか
コネクションし直しとか、あまりXcodeを信用しないほうがいいよ。
- クリーンはよく分かる
IBの変更の反映ってちょっと遅いもんね
- あーもうコード書くの面倒臭くなってきた。
アップルの自社製品のUIはやたらと凝ってるし
それに似てないとみんな「○○みたいには出来ないんですか?」と
納得しないし。
- IBはCmd-0でアウトライン表示にするとレイヤー選択するの楽。
- すいません、お尋ねしたい事があるのですが・・・
FoundationやAppKitには、Windowsで言うところの「GetTickCount()」のような内部カウントを取得する関数って無いんでしょうか?
色々と探してみたのですが、どうにも見つからなくて・・・・・・
- 普通にBSD系関数使えば?
- >>414
似せて作る要望がそんなに強いのか…。
機能がまずは大事だろうし、気が向いたらビジュアルを作り込む
位の心意気でいいと思うよ。肩の力を抜こう
- mach_time.h
- ソフトを使う人はプログラマじゃないのでUIも非常に大事だと思いますよ
あとMacを普段触ってる人ならOSXライクなUIにすることでおのずと操作性も上がると思います
- >>416
使い方も精度もよくわからんけどNSDateとかどうでしょう
NSDate *date1 = [NSDate date];
~~
時間のかかる処理
~~
NSDate *date2 = [NSDate date];
NSTimeInterval time = [date2 timeIntervalSinceDate: date1];
NSTimeIntervalはdoubleのtypedefです。
ところで別の質問ですが
[NSString stringWith...]の戻り値はautoreleaseされてると思うんですが、
autoreleaseされてる、されていないの区別はどうやってつけるんですか?
たとえば上の[NSDate date]はどっちになるんでしょうか。
- >>421
返ってくるオブジェクトが、シングルトンでないかぎりautoreleseされてると思う。
- >>421
autoreleaseされているかどうかよりも
自分でreleaseする必要があるかどうか、という考え方のほうがCocoa的だと思います。
名前がnew/allocではじまる、もしくはcopyを含む(copy/mutbleCopyなど)メソッドで
オブジェクトを得たとき 以 外 はオーナーシップが発生しない(と期待される)ので
[NSDate date]の戻り値は自分でretainしない限りreleaseする必要がありません。
ttp://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html
- 自作のFrameworkに含まれるMyButtonとかMyObjectとかを、
Frameworkを利用したい別プロジェクトのIB上でボタンとかオブジェクトに割り当てて置いておくことってできないのでしょうか?
- >>422
>>423
なるほど勉強になります。
ヒレガス本を見てたらP59にreleaseに関する規則が書いてありました。
古いせいかnewではじまるものは書いて無かった。Xcodeですらないし。
>>421のNSTimeIntervalなんですがドキュメントにはsub-millisecondという単語が出てくるんで
精度はサブミリ秒なんでしょうが、サブミリ秒が10ミリ秒なのか、100ミリ秒なのかその他かは解らんです。
- >>421
NSAutoreleasePool *pool;
NSSring *test = [NSString stringWithString: @"a"];
printf("%d¥n", [test retaincount]);
[pool release];
printf("%d¥n", [test retaincount]);
[pool release];
ではautoreleaseで仮開放されたオブジェクトが開放される。
これでautoreleaseされている事を数値として確認できるはず
- >>426
それでは、[pool release] で test が release されていた場合に、
次の [test retainCount] でクラッシュする可能性がありますぜ。
せめて NSString* test= [[NSString stringWithString:@"a"] retain];
ぐらいしておかないと。
あと、NSString* は激しく最適化されてるから、
test で何がかえってくるか定かでないよね。
NSConstantString である @"a" が、
retain autorelease されて返ってきても、
retain も autorelease もされずに返ってきても文句は言えない ...
- >>427
おおそうであった。指摘ありがとう
NSAutoreleasePoolを使う事で一時的オブジェクトである事を確認できる事を考えてて
コーディングが甘くなってたわ。いかんいかん
- >>417
>>419
>>421
皆様、遅くなりましたが、ありがとうございます。
BSD、mach_time.h、NSDateなどのキーワードを散りばめて検索してみたら、色々なページが見つかりました。
ttp://developer.apple.com/jp/qa/qa2004/qa1398.html
ttp://numata.designed.jp/?Diary%2F2008-01-18
ttp://blog.cocoa-study.com/?eid=71951&target=commentform
ttp://kzk9.net/column/time.html
まさに知りたい情報で感動しました!
これからコード書いて、色々と試してみます。
- copyWithZoneって何ですか?
これを入れたら落ちなくなるおまじないだと思ってるのですがw
- じゃあ、そうなんじゃね?
- たまには上げるかな。
>>430
- (id)copyl;
- (id)copyWithZone: (NSZone*)theZone;
copyというのは、自分のオブジェクトが持っているインスタンスをまるまる
複写して所有権付きで呼び出し主に渡すというもの。
copyWithZoneてのは、メモリゾーンを指定して同様の事をするもの。
落ちなくなるおまじないってわけでもない。
呼び出したらretainが一回入ってるので所有権に注意。
- >>424
もちろんできます。
- そういやIB3のライブラリに独自GUI部品追加するのってどうやるんだろ
IB2ではNIBプラグインかなにか入れてた気がするがあれはもう使えんよな
- >>433
自己解決しました、どうも
- >>434
ibplugin に変わりました。
Cocoa Bindings使いまくり。
- >>431-432
なんとなくわかりました。
ありがとうございました。
- >>437
質問の背景がよくわかりませんが、例えばNSTableColumnの
dataCellはデータの増減によってコピーされます。
copyは実際はcopyWithZone:NULLが送信されています。
一例としてSample programのSourceViewのImageAndTextCellの
- (id)copyWithZone:(NSZone*)zoneをコメントアウトすれば、
super classにcopyWithZone:が送信されるため
imageが存在しないので、クラッシュするのは当然のことです。
- >>438
>Sample program
突然何の sample program の話をしてるの?
- 読み取れ
- Xcode3.1でソースの一番下までスクロールした状態でコード補完させると、勝手に上へ数行スクロールするようになりました。
原因わかる人教えてくれ。
Xcodeスレは1000目前にしてDAT落ちしたね。
- xcodeスレ落ちた
だれか次スレおね
- >>442
いらないでしょ
- そんなに分類する必要ないでしょ
Carbonスレも最近立ってるけど、Mac開発全般1スレだけで良さげ
- 質問です
NSResponderの
- (BOOL)performKeyEquivalent:(NSEvent *)anEvent メソッドを上書きしてキーを押したときのNSEventの中身を調べていました。
シフトやオプションを押しながらキーを押すと当然modifireFlagsの値は変わるのですが、
なぜかウィンドウのcontentViewをクリックした後とタイトルバーをクリックした後でも値が変わってしまいます。
Modifier FlagsのMaskについてもドキュメントを参照したのですが、なぜこの2通りのときで値が変わるのか、modifireFlagsに何が入ってているのか分かりませんでした。
どういったことでこの違いが起きているのでしょうか?
サンプルプロジェクトを上げたのでよろしければ見てください。
http://mac.hitobashira.org/up/src/maka0081.zip
- 確かに、1 << 8 値が変わるな。
- 内部的な何かの処理のなのでしょうか。
とりあえずその部分を無視しようと以下を追加しました。
NSString *key = [theEvent charactersIgnoringModifiers];
NSUInteger flag = [anEvent modifierFlags];
if (flag & 1 << 8) mask -= 1 << 8;
if ([[self keyEquivalent] isEqualToString:key] && [self keyEquivalentModifierMask] == mask) {
return YES;
}
正しく動作はしますが、やり方としてはこのような感じで合ってるのでしょうか?
そもそも
0x100 16進数
256 10進数
1 << 8 ???
って感じで最後のがよく理解できてない状態ですが、、。
- >>445
ちっとも進展してないが、とりあえず報告
OS X10.5.4
Macbook Pro
トラックパッドの下のボタンを使ってクリック
T1:ViewをクリックしてからShift+Option+アルファベット 655650
T2:タイトルバーをクリックしてからShift+Option+アルファベット 655394
で、USBで接続しているワコム[ペンタブ/マウス]を使うと再現せず
W1:ViewをクリックしてからShift+Option+アルファベット 655650か655394
W2:タイトルバーをクリックしてからShift+Option+アルファベット 655650か655394
数値はトラックパッドで行った時のが引き継がれる模様
T1のあとならW1,W2共に655650でした
もちろんwacom[ペンタブ/マウス]でも普通の操作はできる
で、NEC製の普通のマウスで同様にするとトラックパッドと同じ結果
単にワコムのペンタブとマウスが特殊なのが解っただけでしたw
- if (flag & 1 << 8) mask -= 1 << 8;
をしなくても
[self keyEquivalentModifierMask] == mask
の演算子をいじるだけで同じ働きができたりしないでしょうか?
- >>448
調査ありがとうございます。
じっくり読ませていただきます。
- >>448
名前が残ってた
>>450
多分何も関係ないからさらっと流しといてください
- >>447
マスクなんだから
if ([[self keyEquivalent] isEqualToString:key] && ([self keyEquivalentModifierMask] & mask)) {
とすればよいと思いますが?
Testing for Event Type and Modifier Flags
http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/EventHandlingBasics/chapter_4_section_5.html#//apple_ref/doc/uid/10000060i-CH5-SW16
- >>451
読んでみたところペンタブだと現象が起きないということですね。
>>452
試してもらえば分かると思いますが、それではうまくいかなかったのです。
サンプルプロジェクトに書いたように
if (flag & NSShiftKeyMask)
if (flag & NSCommandKeyMask)
で一つ一つのflagの有無はチェックできるのですが、
if ([self keyEquivalentModifierMask] & flag)
では
[self keyEquivalentModifierMask]が設定されてないと常にNOを返してしまうようです。
ちなみに>>447のコードのmaskのとこはflagでした、すいません。
- >>453
マスクとビット演算のこと分かってないんじゃないかな。
if ([self keyEquivalentModifierMask] & flag) で[self keyEquivalentModifierMask]が0だったらNOなのは当然でしょ。
- >>453
結局何をしたいのか具体的に書いてみてはいかがでしょうか
わかってないのは自分だけ?
- >>454
すいません、正直ビット演算はまだ理解が浅いですが、
上記の例で当然0になるという点は理解しています。
「返してしまうようです」という書き方は不適切でした、すいません。
>>447の例を最適なコードにするにはどうしたら良いでしょうか?
- >>456
自分には難しそうです、何かわかればまた書きます
- >>456
いやそもそも何をしたいのかがさっぱり分からん。
単に修飾キーを判定したいだけならこんなごちゃごちゃ書く必要ないじゃん。
- ことの発端は>>445です。
修飾キーの判定には先に挙げたような
if (flag & NSShiftKeyMask)
といったものが使えます。
しかし特定の修飾キーに関してではなく、ここでのselfにあたるオブジェクトに設定された修飾キーと同じかどうか(もしくは全て含むかどうか)を判定しようとしたところ、
Modifire Flagsのドキュメントに載っていない 1 << 8 という値が飛んできて、しかもそれが特定の条件化で来たり来なかったりといったところで、どうしようかとなったわけです。
条件が分かればそこをチェックしてFlagの判定に組み込めばいいのですが、
ここまでの流れはそのFlagをどう無視するかというものでした。
例えば、
if (flag & NSShiftKeyMask)
if (flag & NSCommandKeyMask)
などすべて列挙していって、ドキュメントに書かれていない例外的なFlagを無視することもできます。
これは>>447の方法よりコードの信頼性は高いと思いますが、非常にアナログな手法で、もっとスマートにフラグの判定をできないかと思った次第です。
- >>459
今一よく分からんが、「selfにあたるオブジェクトに設定された修飾キーと同じかどうか(もしくは全て含むかどうか)を判定」
すればいいのね?だったら>>447は
if ([self keyEquivalentModifierMask] & [anEvent modifierFlags]) {
return YES;
}
でいいじゃん。あ、上のコードは修飾キーだけの判定ね。
- >>460
間違えた。全ての修飾キーが一致しないとダメなんだったか。>>460だとどれか一つ一致すればYESになるね。
([self keyEquivalentModifierMask] == [self keyEquivalentModifierMask] & [anEvent modifierFlags])
でどうかしら。
- >>461
== のが & より優先度が高いから括弧がいると思う
参考までに例外的なフラグを削除するなら
flag = flag & NSDeviceIndependentModifierFlagsMask;
で出来ると思う
OS X 10.4以上で動くはず
- やはりうまくいきません、、
またサンプルプロジェクト上げてみます。
良かったから動作を確認してください。
http://mac.hitobashira.org/up/src/maka0083.zip
実際に正しくkeyEquivalentとkeyEquivalentModifierMaskが設定されているのはIBでRunしてみて確かめてみてください。
- NSDeviceIndependentModifierFlagsMaskチャレンジしてみます。
- flags = flags & NSDeviceIndependentModifierFlagsMask;
をしてから
if ([self keyEquivalentModifierMask] == flags)
すれば完璧に動作しました!
NSButtonの場合ですが、まとめるとこうです。
- (BOOL)performKeyEquivalent:(NSEvent *)anEvent {
if ([anEvent type] == NSKeyDown) {
NSString *key = [anEvent charactersIgnoringModifiers];
NSUInteger flags = [anEvent modifierFlags];
flags = flags & NSDeviceIndependentModifierFlagsMask;
if ([[self keyEquivalent] isEqualToString:key] && [self keyEquivalentModifierMask] == flags) {
[self performClick:nil];
return YES;
}
else {
return NO;
}
}
return [super performKeyEquivalent:anEvent];
}
感激です、みなさまありがとうございます!
- >>465
それは良かった。
けど>>463のプロジェクト、俺の環境だと修飾キー関係なくて[self keyEquivalent]がそもそも空文字列だ…
- なぜでしょう、、
IBのバージョンとかかも知れません。プロジェクトファイルはXcode3.1とIB3.1で作りました。
IBでkeyEquivalentを設定しなおしてみてはどうでしょうか?
- >>467
ごめん一番左上のボタンの動作をデバッグで拾ってただけだった。
で、>>461+>>462だと、修飾キーが一つも合ってないときに修飾キー無しのボタンがヒットするのね。
確かにこの使い方には>>465の方がいいかも。
- 時々、QuickTimeの「MPEG-4の書き出し」に似たウィンドウをQuickTime以外のアプリでも見かけるのですが、QTKit等から呼び出し可能なのでしょうか。
もし呼び出す関数をご存知の方いましたら教えていただけるとうれしいです。
- これのことかな
http://www.cocoadev.com/index.pl?QTMovieExportSettings
- >>470
ありがとうございます。
- バインディングの勉強をしています。
IBで、ArrayControllerと、Window、その上に1列のTableViewと「+」Button、「-」Buttonを配置します。
TableViewのColumumのvalueを、ArrayControllerのarrangedObjectsの適当なModel Key Path名にバインドします。
「+」ButtonをArrayControllerのadd:アクションに繋げます。
「-」ButtonをArrayControllerのremove:アクションに繋げます。
これで、編集可能なTableViewができたのですが、「+」Buttonで行を追加したとき、
追加された行は選択状態にはなりますが、編集状態にはなりません。
編集状態にするには何をすべきでしょう?
Xcode2.5/Interface Builder2.5.6
- >>472
+ボタンとArrayControllerの間にお手製のコントローラを挟んで、(or ArrayControllerをサブクラス化して)
その中で- [NSTableView editColumn:row:withEvent:select:]を呼んであげる。
- >>473
やはりIBだけでは無理なんですね。とりあえず以下のようにしたらできました。
@interface MyTableController : NSArrayController{
IBOutlet NSTableView* _tableView;
}
@end
@implementation MyTableController
// たった今追加&選択されたのを編集状態に
- (void)editSelected:(id)sender{
int r = [_tableView selectedRow];
if( (0 <= r) && (r < [_tableView numberOfRows]) ){
[_tableView editColumn:0 row:r withEvent:nil select:YES];
}
}
- (void)add:(id)sender{
[super add:sender]; //本来の処理
// 次のイベントループ?で編集状態にする
[NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)0.0
target:self selector:@selector(editSelected:) userInfo:nil repeats:NO];
}
@end
Timerで一度間を置かないと成功しませんでした。これは、add:自体はモデル(arrangedObjects)に
1要素追加しただけで、TableViewが新規行を認識するのはそれより後だから、だと認識しています。
で、add:→TableViewが新規行を選択→編集状態にする の順でやるのが自然な流れかと思います。
TableViewのDelegateかNotificationでもできそうですが、バインディング的にはKVOでやるべき
なのかな~?とか推測してますが理解不十分でよく分からん状態です。
何であれ上の方法ではちょっと不確実のようにも思えるのでもうちょっと追求してみます。
とりあえずはレスありがとうございました。
- PanelにTableViewを表示させてフォーカスがTableViewのままの状態で
Panelを閉じて、Panelをreleaseすると落ちてしまうんだけど(release when
closedは当然OFF)、これを回避出来る方法ってない?
- それでは落ちない
別のとこに原因がある
- >>475
release後にpanelに配置したviewにアクセスしておらぬか?
- >>477
手順としては
XXXPanel *panel = nil;
@try {
panel = [[XXXPanel alloc] initWith...];
...
...
// OKで値を取り出してclose
// CancelはPanelをcloseするだけ
}
@finally {
if (panel)
[panel release];
}
とやってるので、Panelをcloseした後にreleaseしてるんだけど・・・
- さらに補足すると
他のアイテム(例えばテキストフィールド)にフォーカスがある時は問題ないけど
TableViewにフォーカスがある時はcloseしてreleaseすると落ちてしまう。
う~~~~ん・・・わからん。
- スレ汚しすまん。
落ちるというのは不正確だった。アプリ単独で起動した場合は落ちるわけでは
ないのだけど、Xcodeから起動して、上の動作をさせると必ずgdbに落ちてしまう
わけ。問題ないんだろうか?
- Xcode 3.1/Mac OS 10.5.4(intel)です。
[NSToolbarのインスタンス items];で、"現在ツールバーに表示されている"NSToolbarItemの配列が取得できますが、
ツールバーに現在表示されているアイテムだけでなく、「ツールバーのカスタマイズ」より追加登録可能なアイテムを含めたNSToolbarItemの配列を取得するには、どうすれば良いのでしょうか。
- >>478
そのテーブルのバインディング関係じゃない??
XXXPanel がリリースされてるのに、バインディングがまだいきているとか
- だいたいこの手のトラブルはショボいミスの場合が多いので、
質問者は連投して「俺はミスっていない」な意識を高める方向に向かわず
もう一度、基本的なことを見直してみよう。
- 誰も気にしてないと思いますが一応報告を
>>474の方法はやはりダメでした。+ボタン連打したりするだけでもう変な動きになります。とりあえず以下のようにKVOでやったらうまく行ってそうです。
@interface MyTableController : NSArrayController{
IBOutlet NSTableView* _tableView;
}
@implementation MyTableController
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
static int beforeRowCount = 0;
// arrangedObjects に変化があった
if( keyPath != nil && [keyPath isEqualToString:@"arrangedObjects"] ){
// 新規行(row)が追加された
int rowCount = [_tableView numberOfRows];
if( rowCount > beforeRowCount ){
// 選択されている(=新規の)行を編集状態にする
int editRow = [_tableView selectedRow];
if( (0 <= editRow) && (editRow < rowCount) && (0 < [_tableView numberOfColumns]) ){
[_tableView editColumn:0 row:editRow withEvent:nil select:YES];
}
}
// 次回のために保持
beforeRowCount = rowCount;
}
}
- (void)awakeFromNib{
[self addObserver:self forKeyPath:@"arrangedObjects" options:0 context:NULL];
}
@end
- >>482
いや、バインディグは使ってないよ。昔ながらのアウトレット。
dataSourceとdelegateしか繋いでいない。
そもそも何でTableViewにフォーカスがある時だけgdbに落ちるのかが不明。
- >>485
落ちる時のコンソールに多分重要なヒントがあると思う
- だから、そういう時は環境変数で
NSZombieEnabled=YES
だってば。
- >>484
>>474 みたいに NSArrayController をサブクラス化して、_tableView を持たせて、
-add: ではなく-addObject: をオーバーライドしてみては?
- (void)addObject:(id)object
{
[super addObject:object];
[_tableView editColumn:0 row:[_tableView selectedRow] withEvent:nil select:YES];
}
-add: は結局 -addObject: を呼ぶので。
当方のソフトでは、これだけで(Timer なしで)うまく動いているようです。
- すっごく適当でいうけど、
performSelector一発でなおる症状だったりしない?
遅延実行って結構効果あるよ
- ごめん、performSelector:withObject:afterDelay: ね
- CALayerに対するマウスイベントってどうやったら取得できますか?
mouseDown:みたいなメソッドがないみたいなんですが。
- >>488 確かにそれでうまく動いてます。
>-add: は結局 -addObject: を呼ぶので。
あれ?でも、>>474ではadd:の直後はselectedRowが更新されてなかったのに、
addObject:の後はselectedRowが更新されてるんだなー、と思いArrayControllerのサブクラスで
- (void)add:(id)sender
{
NSLog( @"CALLED %s", __func__ );
[super add:sender];
NSLog(@"%s selectedRow=%i", __func__, [_tableView selectedRow] );
}
- (void)addObject:(id)object
{
NSLog( @"CALLED %s", __func__ );
[super addObject:object];
NSLog(@"%s selectedRow=%i", __func__, [_tableView selectedRow] );
}
としてみたところ、以下のようなログでした(Tableが空の状態でadd:を呼んだ場合)
CALLED -[SCTableController add:]
-[SCTableController add:] selectedRow=-1
CALLED -[SCTableController addObject:]
-[SCTableController addObject:] selectedRow=0
これからすると、add:は"中で"でなく"後で"addObject:を呼んでるんですね。
この辺の動き、リファレンスに明記されてないので将来的に変わらないのかちょっと不安ですが、
これが一番良い方法と思いますので使ってみます。ありがとうございました。
※ ちなみに、addObject:は"中で"insertObject:atArrangedObjectIndex:を呼んでいるので、
[_tableView editColumn~]はオーバーライドしたinsertObject:~の中でやればinsert:にも対応できました。
- >>491
マウスイベントなどは、NSView側で受けるしかありません。
そのあと、CALayerクラスのconvertPoint:fromLayer:とか、hitTest:とか、containsPoint:とかを使って、どのレイヤーでマウスダウンが発生したか調べてください。
- できる限りageて質問してねっ♪
- よっしゃ
- >>493
マジっすか…ありがとうございます
- >>481は無理なのかなぁ…うぅむ
- >>497
俺は古い人間なので、ツールバーはIBじゃなくてdelegate使って作ってる。
その方法だとデフォルトのアイテムも、カスタマイズで追加可能なアイテムも、選択可能なアイテムも全てコードで指定するので
そもそも>>481のようなことをする必要がない。
- >>486, 487
Xcode 3のデバッガは使いにくくなった上にデバッガ自体が落ちてダメでした。
パネルを閉じてもTableViewが生きているような・・・
結局、パネルのreleaseは@finally{}ブロックでやらずに、パネルのrelease when
closedにチェックを入れたらデバッガに落ちることはなくなりました。閉じたら
すぐにreleaseしなければいけない?
- ObjCでsuperクラスのsuperクラスを取得する場合は、どうすればよいのでしょうか?
[[super super] xxxx] という感じの事をしたいのです。
superクラスがxxxxのメソッドを間違った形で上書きしているので
どうにかしてその親のメソッドを呼びたいのです。
- ぜんぜん全く推奨しないけど、
@implementation SuperClass (overwride)
-xxxx { return [super xxxx]; }
@end
か、だめなら
+(void)initialize;
あたりで
Class sc = [super class];
Class ssc = sc->super_class;
Method sm = class_getInstanceMethod(sc, @selector(xxxx));
Method ssm = class_getInstanceMethod(ssc, @selector(xxxx));
sm->method_imp = ssm->method_imp;
とするか。
- おおっありがとうございます。
早速試してみます。
- そんなのできるんですか、、
知らなかったから同じような状況の時、目的のクラスの機能を全部実装してたorz
- >>498
Tigerのときみたいにソースで実装するしかないのかな…
IBでNSToolbar作ると、Identifierがランダムな文字列になるので、
Identifierを知るために
テストランして、ツールバーカスタマイズして、全部のツールバー表示した状態で
for(int i=0;i<[[MyToolbar items] count];i++){
NSLog([[[MyToolbar items] objectAtIndex:i] label]);
NSLog([[[NyToolbar items] objectAtIndex:i] itemIdentifier]);
}
をするというめんどくさいことやっている。
どうにかIdentifierだけでも手に入れられる関数があればいいんだが…
- 訂正
全部のツールバー>全部のツールバーアイテム
- あのさ、IBにあるデフォルトに[[toolbar items] count]したら7ってでたんだけどさ、
これって追加可能な全部のツールバーアイテムじゃないのか
- あのさ、IBにあるデフォルトのToolBarに
です
- >>507
「あのさ」は必須なわけねw
- >>506
ツールバーカスタマイズして表示項目減らしてためしてみればわかると思うよ
- >>506のために
http://wktk.vip2ch.com/dl.php?f=vipper93667.zip
- >>507
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar
使った事がないけど、この辺のインスタンスメソッドで引っぱりだせないかな
- >>511
それはデリゲートメソッドです
- >>512
NIBで作った時にはその辺も作られてるなら、動作するかもしれんがどうなのだろう。
- >>513
IBでNSToolbarを作って試してみたが、delegateは設定されてなかった。
- >>511
デリゲートメソッドの意味わかってる?
- ごめん。>>515はなかったことに
- Xcode 3.1です。
@implementation MainClass
-(IBAction)connection:(id)sender{
NSLog(@"connection");
NSSocketPort *sock=[[NSSocketPort alloc] initRemoteWithTCPPort:80 host:@"192.168.0.2"];
NSFileHandle *socketHandle = [[NSFileHandle alloc] initWithFileDescriptor: [sock socket]
closeOnDealloc: YES];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(receiveMessage:)
name: NSFileHandleConnectionAcceptedNotification
object: socketHandle];
[socketHandle acceptConnectionInBackgroundAndNotify];
}
- (void)receiveMessage: (NSNotification*)notification {
NSLog(@"receiveMessage:");
// check error
NSNumber *pUNIXError = [ NSNumber numberWithInt:0 ];
pUNIXError = [[notification userInfo] objectForKey:@"NSFileHandleError"];
if( ![ pUNIXError intValue ] ){
NSData* data=[[[notification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem] readDataToEndOfFile];
NSString* string = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
NSLog(string);
}else{
NSLog([NSString stringWithFormat:@"SocketError:%d",[ pUNIXError intValue ]]);
}
}
これで、「SocketError:9」が出てしまうのですが、考えられる原因は何でしょうか。
Safariでhttp://192.168.0.2にアクセスすると問題なくページが表示されます。
- 9 ってことは EBADF だよね。↓ここらへんが気になるところだけど。
initRemoteWithTCPPort:host:
...
Discussion
A connection is not opened to the remote host until data is sent.
- >>518
>A connection is not opened to the remote host until data is sent.
データを送るまでコネクションが開かないんですかorz
大変そうなのでBSD Socket使います。
- IBで
メニューA
サブメニューB
サブメニューC
で、メニューAにアクションを繋げない場合、
バインディングでメニューAのenabledを設定しても上手く効いてくれません。
(どこかにアクションを繋げると効くため、なにもしないアクションを作って繋げてる)
そんなもんなんですかね?
- >>520
メニューはちょっと特殊でターゲットとアクションが有効でない時には
非アクティブになるという特徴がありますね。それが効いてるのかも
- なんですけど、>>520の場合でサブメニューにはターゲットアクションを繋いで
enabledも設定しているので、サブメニューが全てdisabledの場合は
メニューAもdisabledになってくれるのが理想なんですが。
- >>520
MenuのAttributes InspectorのAuto Enables Itemsのチェック外せば良さそうな気がするけど、これだと全部のアイテムをバインディングすることになりそうだな。
- 画像作成についての質問です。
ARGB各8bitのplanarな配列をNSBitmapImageRepの
initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:
に渡して画像を作ろうとしています。
「白っぽい」色のアルファ値によるグラデーションを作ると、
アルファ値が255から下がるにつれてすぐさまRGBの各値が同じに
揃っていき、「白っぽい」でなく「白」(実際255より小さい
値なので灰色ですが)になってしまいます。
暗い部分にいくにつれて表示されている色のRGBの各値が小さくなるので、
「白」(灰色)に近づいていくのは原理的にわかるのですが、
表示されている色の各RGBの値が均等に下がっていくのではなく、
大雑把ですが(R,G,B)の変化が
(255,255,200)→(230,230,200)→(200,200,200)→(180,180,180)
のようにまず大きい値だけが小さくなっているようです。
配列を直接NSBitmapImageRepに与えずに、
配列の内容をsetColor:atX:yで一点一点塗っていくと期待している
「白っぽい」色のグラデーションになっているので、
配列を直接与える際に何か注意すべき点があるのでしょうか。
- 524の件、自己解決しました。bitmapFormat:に渡す
NSAlphaNonpremultipliedBitmapFormat
を|したつもりが||してました…、大反省…。
- aviファイルからQTTimeオブジェクトを作ると、
- (QTTime) durationの位置にcurrentTimeがあったときに、
- (void) playを呼ぶと最初から再生しようとするみたいなんですが、
currentTimeがムービー長さの最後にあるときはplayを呼んでもそのまま停止にできませんか。
ループしてるのかなと思ってsetMovieAttributes:でQTMovieLoopsAttributeにNOを設定してもだめでした。
- QTView subclassすれば?
- サブクラス作ってplayメソッドオーバーライドして
カレントタイムがデュレーションならstopで行けるんじゃね?
ちなみにavi以外でもなると思う。
- @selector( method ) と
@selector( method: )
の違いを教えてください。
- -(id)method
と
-(id) method: (id)args
の違いと同義。
- 即答サンクス
- iPhoneの電話番号入力みたいに数字の桁が増えると
自動的に文字を小さくするようにしたいのですがTextFieldだと無理でしょうか
設定方法よろしくお願いします。
- サブクラスを作ってdrawInteriorFrame内で文字長に応じてフォントサイズを指定したattributedstringを作成して描く。
携帯なんで綴りがあってないかも。
- >>528
やっぱりcurrentTimeとdurationの比較で制御するしかないですかね。
わかりました。
- WebKitを使ってGUIを持つテキストブラウザを作成する事はできますでしょうか
もしよろしければその設定方法をお教え願います。
- すみませぬ、目的がはっきり見えてこないのでもう少し詳しく情報を。
- w3mやlynxの様にテキストしかロードしないようにしたいのです。
デスクトップでもテキストブラウザを使いたいと思うので。
よろしくお願いします。
- >>537
単純にテキストだけをダウンロードして表示するというのれあれば…
ターミナルでcurl -i http://~~~
などとやったりするけども、それと似たような事をしたいというのであれば
NSURLConnectionでサイトから文字データとして取得、それをそのまま
NSTextFieldに書き込み、等とするといいのかもしれません。
…という目的じゃなかったらすまぬ
- css でごまかせそうな予感。
- w3mをGUIアプリケーションに移植するような感じの
アプリケーションを作りたいのです。
ボタンとかはGUIだが表示はw3mの様な感じに成っているような
- >>540
Cocoaはやっぱり! 出張版
CocoaアプリケーションからUNIXコマンドを呼び出して非同期で処理結果を受け取る方法を解説。 ( NSTask )
http://www.big.or.jp/~crane/cocoa/9000_mdo/MDOnline_2002.01.pdf
w3mをラップしてみたら??
- >>541
これは面白い。
他の技術にも使えそうですね!!
- おぉ、その手の事に興味がおありなら、NSWorkspaceとかも一緒に勉強してみるといいかもしれんね。
- NSTableViewに、
NSPoint aStartPoint = NSMakePoint(0.0, 0.0);
NSPoint anEndPoint = NSMakePoint(100.0, 200.0);
[self lockFocus];
NSBezierPath *aHighlightPath = [NSBezierPath bezierPath];
[aHighlightPath moveToPoint:aStartPoint];
[aHighlightPath lineToPoint:anEndPoint];
[aHighlightPath setLineWidth:2.0];
[[NSColor blackColor] set];
[aHighlightPath stroke];
[self unlockFocus];
したら、マウスが上にあってアクティブなセルにしか描画されなかったんで、
他のセルも再描画してやったらいいだろうと思って、
[self drawRow:1 clipRect:[self bounds]];
してみたけど変化ありませんでした。
どうやってやるのが正しいんでしょうか?
- NSTableViewに
- (void)setNeedsDisplay:(BOOL)flag;
のメッセージを送ってみるとかどうでしょう。
- >>545
おおお、できました(・∀・)
助かりました。ありがとーございます。
- NSTaskを使おうと思ったのですが、もうなんか文法とかで突っかかり
まくり凄くへこみました。
CocoaはさっぱりどころかObjective-Cがさっぱりな状態。
Objective-Cからやり直してきます。
- 別ブロセス起動時のargmentにはchar * しか渡せないでしょうか?
NSArrayやNSDictionaryをいったんchar * にして別プロセスに渡して、別プロセスの
int main (int argc, const char * argv[]) {
}
の中でまたargv[1]とかargv[2]からNSArrayやNSDictionaryに戻すようなトリッキーな変換方法はないでしょうか?
- 別プロセスにオブジェクトを渡すのに、確かNSpipeなるものが使えたと思う。
ちょっと使い方が凝ってたのでまだ勉強していない所だけれども…
- NSPipeは別プロセスからの出力と認識していましたが、入力もできるのでしょうか?
NSConnecionも検討していたのですが、上記の件はPropertyListを使う事でできました。
今日一日飯も食わずこれで悩んでたのでこんな単純なことで解決して吊りたい気分です。
- あ、オブジェクトのやり取りの話しでしたな…
NSPipeで行けると思ったけれど、NSConnecionの方がオブジェクトのやり取り
そのものを扱ってるのでこちらがいいかと思う。
- >>548
NSProcessInfoのargumentsを使うと
起動時の引数をNSStringの配列で取得できます。
数値とか文字列のような単純なオブジェクトでないものを別プロセスと
やりとりするなら分散オブジェクトが簡単だと思います。
- おおーこれは素晴らしいものを教えていただきました。
今後のためにも分散オブジェクト勉強してみます。
- いままでCocoaをRubyCocoaで使っていましたが
Appleの解説サイトでも説明はObjectiv-Cで基本書いてあるので
Objective-Cを勉強したいと思うのですが、どのへんまでかけるように
なればCocoaに手を出せば良いのでしょうか?
Objective-Cで何でもかけるようにならないとCocoaは手を出してはいけない
のでしょうか?
よろしくお願いします。
- >>554
興味を持ったら手を出してOKだと思う。自分もそうだった
- >>555
そうですかありがとうございます。
興味は有るのですがObjective-Cでなにもかけないんですよね・・
例えばallocってのがなんだ?みたいな感じでして
- >>556
そのレベルでもOK w
自分も#importって何じゃ、インスタンスオブジェクトって何じゃ?
一番最初のソースって一体どこに書けばいいんじゃ?
とか最初は本気で悩んだもんだ
とりあえず、簡単なサンプルプログラムを見て勉強したり
HMDTなどの書籍等を読んでみるのもいいかも。mixiなどのコミュニティーとか
相談してみるのもいいかもしれんし(あ、最近更新してなかった…w)
ある程度分かってくると、詳解Objective-C 2.0あたりもいいけど、まずは
基本的な所からがいいと思う。NIBで自作オブジェクトをインスタンス化して
そのIBOutletとかIBActionの接続あたりを理解できると、そこあたりが
足がかりにできるかもしれん
- なるほど
わかりました。何か入門に成るサイトを探してサンプルプログラムを
みてみます。ありがとうございました。
- Obj-C 1.0 だが、ADC Japan に HMDT 木下さんが講師で年に数回?やってる
Cocoa セミナーのムービーがあるよ。自分はこれで流れをつかんだ。
配布資料は Obj-C 2.0 に対応している。
ADC Japan(ココの真ん中くらい)
ttp://developer.apple.com/jp/documentation/japanese.html
- qtmovieの任意の時間のフレームをciimageに変換したいんだけど、
NSImageをqtmovieから取得して、それをimagerepに展開してCIImageに変換するってやってんですけど。
NSBitmapImageRepを使うと物凄く時間がかかってる気がするなあ。
もうちょっと高速化できるアイデアって無いもんでしょうか。
- 再生中のQTMovieからカレントタイムでイメージを作成するのは遅くなるよ。
表示中のサイズが大きいと、そのサイズからイメージを作成しようとするから
メモリもバンバン食うし。
- 基本的にはMovieをInactiveにした状態で取り出すと処理が軽い、らしい。
だから、同じムービーのインスタンスを二つ作るとかどうよ。
- Cocoaの話題でなくて恐縮ですが、CoreFoundation系のものって
CFStringRef string;
みたいに宣言しただけでは中身はNULLで、
string = "abc";
みたいにするとすでにRetainされていて、いらなくなったら
CFRelease(stringRef);
で必ず解放してやらなければならない。
CFStringRef otherStringRef = stringRef;
とした場合は stringRefだけを解放して、otherStringRefは何もしなくてOK。
と、このような認識であってますか?
もう一点、
CoreFoundationにはautorelaseがないのですが、
メソッドで返した値はメソッドで呼び出した方で解放する、ということで良いでしょうか?
Cocoaは分かるのですが、CoreFoundationはさっぱり!です。
- >>563
基本的に = で代入するだけではretain release動作は自動ではされないはずなので、
その認識で大丈夫だとは思う…。
("abc"が定数として挙動していなければ)
- >>563
http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html
- >>563
string = "abc";
これはCFSTR("abc")じゃないでしょうか?
- >>564
ありがとうございます。
>>565
ありがとうございます、読んでみます。
>>566
おっしゃる通りです、書いてから気付きました、、
CoreFoundationにしかない機能の一部をCocoaにラップしたframeworkを作っていて
メソッドでautoreleaseされたオブジェクトを返すにはどうしたらよいのか?
NSString * とCFStringRef とでキャストを利用した場合、
実体が返されるのか新たにキャストされた実体が作られて返されるのか?その時retain releaseはどうなっているか?
など疑問が湧いてきましたが、とりあえず後日>>565のドキュメントを読んでみます。
もう朝だ、、
- >>567
そういう用途ならautorelease使えるよ。
CFStringRef string = うんたらかんたら;
[(NSString *)string autorelease];
return (NSString *)string;
みたいにキャストしてCocoaのオブジェクトとして扱える。
キャストしただけでCocoaのオブジェクトとして使えるってことはつまり、CFString構造体こそNSStringの実体なんだけどね。
- GCを考慮するなら
return (NSString *)[ NSMakeCollectable(string) autorelease ];
にするべき
- 質問です。どの辺りが問題なのかよく分からないので関係のあるメソッドの中身を全部張ります。
長いソースでスレ汚ししてすみません。
*2のところで-(void) appendString:(NSString *)aStringしてるんですが、
連結されずに元々入っていた文字列のままになってしまっています。
*1のところで[array objectAtIndex:9]の代わりに@"あああ"とか入れるときちんと連結されます。
また、parsedStringはnilとかじゃなくて元々意図した文字列(lsの結果)が入っているので原因がよくわかりません。
何が問題なんでしょうか?ご教示ください。
NSMutableArray *list = [[NSMutableArray alloc] init];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/ls"];
NSArray *array = [NSArray arrayWithObjects:@"-AlFcT", currentDirectory, nil];
[task setArguments:array];
NSPipe *outPipe = [[NSPipe alloc] init];
[task setStandardOutput: outPipe];
[outPipe release];
[task launch];
NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
int status = [task terminationStatus];
[task release];
- 続きです
if(status == 0){
NSString *aString = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];
NSString *bString;
NSMutableString* parsedString;
NSRange range, subrange;
int length;
length = [aString length];
range = NSMakeRange(0, length);
[list addObject: @".."];
// total * の部分をスキップする
subrange = [aString lineRangeForRange:
NSMakeRange(range.location, 0)];
range.location = NSMaxRange(subrange);
range.length -= subrange.length;
while(range.length > 0) {
subrange = [aString lineRangeForRange:
NSMakeRange(range.location, 0)];
bString = [aString substringWithRange:subrange];
range.location = NSMaxRange(subrange);
range.length -= subrange.length;
NSArray *array = [self split:bString delimiter:@" "];
parsedString = [NSMutableString stringWithString: [array objectAtIndex:9]]; //*1
[parsedString appendString: [array objectAtIndex:8]]; //*2
NSLog(parsedString);
[list addObject: parsedString];
}
}
- >>570
項目と項目の間がスペース一つではないのかもしれないですね。
試しに
NSLog(array);
を埋め込んでおくと原因が分かるかもしれない。
そして最後にこれも必要と思う。
[list release];
[aString release];
- >>570
1.デバッガ使え
2.何故lsを使う必要があるのか分からない
3.何故NSScannerを使わないのか分からない
4.split:delimiter:の処理内容が分からない、ていうかcomponentsSeparatedByString:使えばよくね?
5.やりたいことを教えてくれたら俺が書くわ
- >>572
>NSLog(array);
それはやってみましたが、きちんと文字列が入っていました。
releaseに関しては失念していました。普段c#しか使わないので...
>>573
NSScanner, componentsSeparatedByStringについては存在を知りませんでした。
どうもありがとうございます。調べてみます。
やりたいことに関してですが、ファイラーを作っていて、以下の内容を取得したかったのでlsを使ってみました。
1. ディレクトリ内のファイル/フォルダの一覧
2. 作成日時
3. 種類(ディレクトリ, 実行ファイル, その他のファイル, ソフトリンク, ハードリンク)
4. パーミッション
- >>570,571,574
相当に適当に組んでみた。これを改変して意図するものができるかもしれん。
ttp://nullpo.vip2ch.com/upload.cgi?mode=dl&file=21239
DLP: cocoa
- >>575
おお、早速誰か書いてくれた…ってそれほぼCじゃねーかw
というわけで俺も書いてみた。豪語しておいて稚拙ですまんが。if(status == 0){ 以下のだけ書くね。
ちなみにlsの出力の意味は知らん。
if(status == 0){
NSString *aString = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];
NSArray *lsOutputLines = [aString componentsSeparatedByString:@"\n"];
NSEnumerator *lsOutputLineEnumerator = [lsOutputLines objectEnumerator];
NSString *lsOutputLine;
lsOutputLine = [lsOutputLineEnumerator nextObject]; // Skip first line
while (lsOutputLine = [lsOutputLineEnumerator nextObject]) {
NSScanner *lsOutputScanner = [NSScanner scannerWithString:lsOutputLine];
NSCharacterSet *whitespaceCharacterSet = [NSCharacterSet whitespaceCharacterSet];
NSString *item;
NSMutableArray *items= [NSMutableArray array];
while (![lsOutputScanner isAtEnd]) {
if ([lsOutputScanner scanUpToCharactersFromSet:whitespaceCharacterSet intoString:&item])
[items addObject:item];
}
if ([items count] > 9) {
NSMutableString* parsedString = [[[items objectAtIndex:9] mutableCopy] autorelease];
[parsedString appendString:[items objectAtIndex:8]];
NSLog(parsedString);
}
}
}
- >>575
わざわざ組んでいただいてどうもありがとうございます。
後で自分の書き込みを読み返してみて、デバッグの手伝いをお願いしてるみたいな感じで申し訳ないし、
そうなってしまってたらすれ違いだしで(´・ω・`)でしたが、みなさん親切な方で嬉しいです。
もうちょっと考えてから書き込むことにします。ありがとうございました。
- >>576
あ、入れ違いになってしまいました。
どうもありがとうございます。参考にさせていただきます(`・ω・´)
- >>576
あっはっはw
>>577
いいってことよ。
俺にとっちゃ意図を定めたときに頭の中にコードが浮かんで、それを打ち込む瞬間が
パズルを解いてるみたいで、どんなゲームをやるより楽しい。
- NSTableViewのカラムをNSArrayControllerのカラムにバインディングした状態で、
NSArrayControllerに対してselectPrevious:、selectNext:を実行した場合、(もしくは上下
カーソルキーで選択行を変更した場合)NSTableViewの行の選択も追従するのですが、
10.4なら
選択された行がvisibleになるようにスクロールする。
10.5なら
スクロールせず選択された行だけが変わっていく。
となります。
NSTableViewのdelegateで
-(void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
[self scrollRowToVisible:[self selectedRow]];
}
と記述しても10.5ではスクロールしません。
そもそも仕様が変わったのか調べているのですが、該当記事がなさそうです。
なにかよい対処方法はありませんでしょうか?
- >>580
>NSTableViewのdelegateで
とのことなので、
[self scrollRowToVisible:[self selectedRow]];
を
[該当テーブル scrollRowToVisible:[該当テーブル selectedRow]];
とするとうまく行くかも
- >>574
> やりたいことに関してですが、ファイラーを作っていて、以下の内容を取得したかったのでlsを使ってみました。
なぜ、NSFileWrapperを使わないんですか?
- 元ファイルとハードリンクって区別不可能じゃね?
- たしかに、どちらも「本体」だからね。
2つのファイルが、ハードリンクしたものなのかどうかは、ノード番号で分かるけどね。
- >>581
回答ありがとうございます。
>NSTableViewのdelegateで
すみません記述を間違えました。
NSTableViewのサブクラスで [super setDelegate:self];をかましています。
当方10.4/Xcode2.5なので10.5での動作確認がいまいち不安なのですが、
(友人宅の10.5で挙動がおかしかった)まあ、あまり気にしない事にします。
- >> 582
> NSFileWrapper
すみません。単なる勉強不足です。
教えてくださってありがとうございます。
このスレの上の方でNSTaskを使う話が出ていて、
そういやMacってBSDだから、コマンド呼べばいろいろできそうだな。
お、lsとmvとcpでファイラーの基本機能ほとんどできるんじゃね?
ていうかCUIで全部できるはずだからこれでできないわけないよな。
ほとんどシェルのノリで書けばいい。余計なプログラミングしなくていいやー(・∀・)カコイイ
ってノリでどんどん書き始めたので、その辺りのクラス/メソッドをよく調べてませんでした。
もうちょっと調べてみることにします(・A・)バカマルダシカコワルイ
- >>586
ドンマイ!今回の工夫はいつか生きるさ
- あえてls,mv,cpで作ってみるのも面白いと思うけど。
別に真っ当(?)な方法で作らなきゃいけないというわけじゃないでしょ。
ところで>>582はNSFileWrapeprじゃなくてNSFileManager?
- Macのプログラマ向けの案系が多く掲載されている、
受注サイトがあったら教えてもらえませんか?
- >>568
土日明けて亀レスですが有益な情報ありがとうございます。
- >589
そんなのみたことない
- xcode 3.1です。
NSDate型の*x、
int型のy
がある状態で、xからy秒経過した後の時刻をNSDateで取得したいのですが、どのようにしたら良いでしょうか。
- >>592
- (id)addTimeInterval:(NSTimeInterval)seconds
- >>593
ありがとうございます。
- NSCalendar, NSDateComponentsについて質問があります。
インスタンス変数としてNSDate *theDateを設定、NSDatePickerとバインドして
NSDateComponentsの各プロパティを表示する実験をしました。
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSEraCalendarUnit |NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit |
NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit |
NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit;
NSDateComponents *comps = [calendar components:unitFlags fromDate:[self theDate]];
.......
[self setWeek:[comps week]];
......
theDateを年末の53週に相当する日に設定するとNSDateComponentsのweekが
53ではなく1になることに気づきました。
NSCalendar *calendar = [NSCalendar currentCalendar];
NSRange range = [calendar maximumRangeOfUnit:NSWeekCalendarUnit];
NSLog(@"maximumRangeOfUnit:NSWeekCalendarUnit = %@", NSStringFromRange(range));
を実行すると、{1, 53}が返ってきますし、setWeek:で53を設定できるので、weekの値が52まで
ということはないと思います。
これはバグなのでしょうか?それとも当方だけの問題でしょうか?
- Finderからのドラッグ&ドロップで、オリジナルのviewのうえに
画像を貼付けたいのですが、viewの上にドロップした時のマウスカーソルの
位置を取得できなくて困っています。
そういう位置はどうやって取得できるのでしょうか?
- >>596
[[NSApp currentEvent] locationInWindow] は使えませんか?
- 早速の返信ありがとうございます。
しかし、ご指摘いただいた[NSApp currentEvent]を使ってマウスの位置情報の入ったNSEventを取り出してみるというのを、試したのですがうまくいきませんでした。
説明が足りず申し訳有りません。以下にソースコードをそのままペーストします。
ほとんど、どこかで拾ってきたサンプルコードのつぎはぎですが、、
eventCheckというのをつくって、[NSApp currentEvent]でわたされたイベントの中身を
デバッガで見てみたのですが、この時点でマウスの位置情報がx=0,y=0になっています。
pathはNSStringで、画像の位置情報です。
MyNCは、自分で作ったクラスです。
-(BOOL)performDragOperation: (id) sender
{
MyDocument *document = [[[self window] windowController] document];
MyNC *DragNC =[[MyNC alloc] init];
//イベントから、マウスの位置をゲットしたかったが、まだやり方がよくわからない。
NSEvent *eventCheck =[NSApp currentEvent];
NSPoint testOfEvent =[eventCheck locationInWindow];
NSPoint pos =[self convertPoint:testOfEvent fromView:nil];
//???
[DragNC setTest:path];
[DragNC setImage:[ [NSImage alloc] initWithContentsOfFile:path] ];
[DragNC setBasepoint:pos];
[DragNC rectOfImage];
[document addFromView:DragNC];
return YES;
}
- >>598
http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/chapter_5_section_4.html#//apple_ref/doc/uid/10000060i-CH6-DontLinkElementID_20
- すごく早い返信ありがとうございます。
アドレスにあったCocoa Event-Handling Guide をよんで、NSWindowのメソッドのmouseLocationOutsideOfEventStream
が使えるのではないかと思って、試した所うまくいきました
599さん、ならびに597さんありがとう。
-(BOOL)performDragOperation: (id) sender
{
NSWindow *testWindow =[self window];
NSPoint mousePoint =[testWindow mouseLocationOutsideOfEventStream];
//これで、mousePointにマウスカーソルの位置がはいりました(^^)
//以下ソースコード略
- ageですね
- >>595
年の最終週は、きっちり終わってないときは翌年のweek 1と同一視することにしているのかも。
(その方が、年をまたいで週をカウントしていく時とか矛盾が出にくいかな)
12/31がきっちり土曜で終わる1994年、2005年等では53が出る。
- >>595
ttp://www.probabilityof.com/iso/8601v2000.pdf
ISO8601 v2000 4.3.2.2 のNOTE4に
> NOTE 4 The rule for determining the first calendar week is equivalent with the rule
>“the first calendar week is the week which includes January 4”.
という記述があります。
- http://developer.apple.com/samplecode/SimpleCalendar/index.html
にあるApple公式のサンプルをビルドしようとしたら、
#import <CalendarStore/CalendarStore.h>
の行で「error:CalendarStore/CalendarStore.h:no such file or directory」
というエラーが出ました。
当方の環境はLeopard, Xcode ver.3.1なのですが、
何か特殊な設定をしないとビルドできないのでしょうか?
- >>604
***.xcodeprojの本窓、「グループとファイル」の中にある「Frameworks」のところで右クリック
「追加→既存のフレームワーク…」
/Developer/SDKs/MacOSX*****.sdk/System/Library/Frameworks/
の階層の中から「CalendarStore.framework」を選択し、追加する。
こちらXcode2.2のため、そのフレームワークがなかったけれど、あればそれでうまく行くはず
- そういやLeopardでXcoee2.xて行けるんですかね?
- >>602,603
595です。返信ありがとうございました。
バグであるにせよ、仕様であるにせよ、yearとweekからdateを算出する時には
注意する必要がありますね。
if ([comps month] == 12 && [comps week] == 1){
[comps setWeek:53];
}
のようなコードで回避可能ではありますが。
今週、先週といったNSPredicateを作成するコードを書いていて気づいたことです。
どうもありがとうございました。
- >> 605
お返事ありがとうございます。
ただ、今見てみたら「グループとファイル」の中の、Frameworks/Other Frameworksという階層の中に、
既にCalendarStore.frameworkがありました。
ファイルをクリックしてみたら中にCalendarStore.hというファイルがあるようなので、
これを読んでくれれば動くと思うのですが、どうもこのframeworkを無視しているようです。
- あ、Releaseビルドに変更したら、やたら沢山警告が出ていますが(内容はDebug時のエラーと同じ)
とりあえずコンパイル通って実行もできました。
Debug設定ではビルドできないんですか?
- >>609
それで正常動作しますか?
-eventPredicateWithStartDate:endDate:calendars:はNSPredicateではなくて
CalCalendarStoreのメソッドだし、
-saveEvent:span:error:のerrorが抜けています。
http://www.cocoabuilder.com/archive/message/cocoa/2007/12/4/194398
- IBでNSMenuItemにショートカットキー(例cmd+])を設定して
実行させてショートカットキーを連打すると使用メモリーがガンガン上がってくのですが、
こんなもんなんですかね?
ちなみにメニューを開いて実行させても使用メモリーは増えないのですが。
10.4.11 Xcode 2.5
- >> 610
カレンダーの表示はできたんですが、編集ができませんでした。
NSPredicateをCalCalendarStoreに変更したらアルファベットの文字列は編集できるんですが、
日本語がまじるとエラーが出ます。
2008-08-24 22:30:21.608 SimpleCalendar[25050:10b] oldDate=2008-08-09 00:00:00 +0900
2008-08-24 22:30:21.608 SimpleCalendar[25050:10b] *** -[__NSCFDate dayOfCommonEra]: unrecognized selector sent to instance 0x25228940
2008-08-24 22:30:21.609 SimpleCalendar[25050:10b] *** -[__NSCFDate dayOfCommonEra]: unrecognized selector sent to instance 0x25228940
このサイトのコードを鵜呑みにしたらダメなんですね。
もう少しCalCalendarStoreについて調べてみます。
ありがとうございます。
- >>608
あ、いあ…
その階層にあるというだけでは駄目で、それをxcodeprojの中に登録しないといけない。
さらにはCalendarStore.frameworkの右の所にチェック(読み込ませる)を入れる必要があるけど
そこまでやってますかな?
- >>608
読み違えた…
>その階層にあるというだけでは駄目で、それをxcodeprojの中に登録しないといけない。
は無視して。
あとはチェックが入っているかどうかと、あとはもしかすると
コマンド+iで「ターゲットSDKを利用したクロス開発」で指定したSDKと、
ロードしたFrameWorkでバージョンのズレがあるとうまく行かなかったような記憶も…
- 私の環境ではXcodeのグループとファイルの中の、
/SimpleCalnedar/Frameworks/Other Frameworks/CalendarStore.framework
の右にはチェックボックスは見あたりません(´・ω・`)
「情報を見る」の中の「ターゲット」内にプロジェクト名とチェックボックスがありますがこれのことでしょうか?
でもこれにはもともとチェックが入っていました。
Xcodeに対するframeworkの追加についてもう一度調べ直してみます。
お手数かけてすみません。
- >>604
Cocoa Break! というサイトをやってる者です。
サイトのソースの部分で、ビルドの前の注意を書いてます。
「ビルドするには、いくつかの場所で NSPredicate を CalCalendarStore に変更する必要がある。
他の警告は引数 error:nil を追加する。」
Mac OS X v10.5、3.0 段階ではこれで問題なくピルドできました。
とりあえず警告ゼロってだけですけど。
説明をするために細かく動作を見ることはしてないんで…。
- 俺もカーボンブレイク!作ろうかな
- 追記ですが、サイトを見てもらえればわかるように、
サンプルはたまにエラーが出てビルドできないものがあります。
スクリーンショットが掲載されているものは、ビルドまでは完了してます。
とはいえ、10.4 でビルドできるものは 10.4 で確認してますが…。
また、それとは別ですが、Moriarity など OS X の古いバージョンのサンプルは、
10.5 では動作しなくなっている場合もあるので、
サンプルコードを参考にする時は注意が必要です。
- >>607
>if ([comps month] == 12 && [comps week] == 1){
> [comps setWeek:53];
>}
>のようなコードで回避可能ではありますが。
いや多分、必ず53週あるという認識が、ISO8601的には間違っている。
しかしNSCalendar,NSDateComponents等を調べると、ISO8601はサポートしていなさそうですね。
NSCalendarのminimumDaysInFirstWeek(デフォルトは1)で、第1週を決めるようになっているみたい。
以下確認したコード。
--
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *oneDayComps = [[NSDateComponents alloc] init];
[oneDayComps setDay:1];
NSMutableArray *days = [NSMutableArray array], *weeks = [NSMutableArray array];
for (NSInteger minimumDaysInFirstWeek = 1; minimumDaysInFirstWeek< 7; minimumDaysInFirstWeek++) {
[calendar setMinimumDaysInFirstWeek:minimumDaysInFirstWeek];
NSLog(@"minimumDaysInFirstWeek:%d",[calendar minimumDaysInFirstWeek]);
for (NSInteger year = 2000; year < 2011; year++) {
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setYear:year]; [comps setWeek:52]; [comps setWeekday:7];
NSDate *date = [calendar dateFromComponents:comps];
for (NSInteger i = 0; i < 9; i++) {
comps = [calendar components:(NSDayCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];
[days addObject:[NSString stringWithFormat:@"%2d",[comps day]]];
[weeks addObject:[NSString stringWithFormat:@"%2d",[comps week]]];
date = [calendar dateByAddingComponents:oneDayComps toDate:date options:0];
}
NSLog(@"%4d",year); NSLog(@" day:%@",[days componentsJoinedByString:@","]); NSLog(@" week:%@",[weeks componentsJoinedByString:@","]);
[days removeAllObjects];
[weeks removeAllObjects];
}
}
- >> HKさん
サイト拝見しました。訂正の必要なサンプルにはコメントをつけてくださってるんですね。
すばらしいサイトを作ってくださってありがとうございます。
Cocoaの勉強に利用させていただきます。
- Moriarityは一応ビルドできて、動いた。
当方 Leo Xcode3.1
- ttp://lists.apple.com/index.html
Appleのメーリングリストの検索がおかしくなってないでしょうか?
何を検索しても何もひっかからない状態になってしまってますがうちだけでしょうか;
- >>619
>NSCalendarのminimumDaysInFirstWeek(デフォルトは1)で、第1週を決めるようになっているみたい。
そんな風になってるんだ。面白い。
ところで細かいことだけど、これって素のccじゃ通らないよね?
自分のとこはXcode 3.1を入れているけどデフォのccではfor内の変数宣言でエラーになります。
もしかして環境によってはObjCもC99がデフォになるのかなと思って。
- for文って条件式のところで変数の宣言をしてるとこ?
拡張子をmmにしてObjective-C++にしてんじゃないの?
- 1)I.BでNSMenuのインスタンスをMenuA、MenuBと2つ作る。
2)NSMenuのサブクラスMyMenuを作り、MenuA、MenuBのカスタムクラスに設定する。
この場合、サブクラスMyMenu内でMenuA、MenuBのどちらなのかを判定したいのですが
可能でしょうか?
メニューアイテムはMenuA、MenuBともに同じ、アクションのターゲットは
別にしたいのです。(MyMenu内でターゲット先のメソッドを呼ぶ)
MyMenuからみて自分のインスタンス名(MenuA or MenuB)が取得できればいけそうな気がしますが、
インスタンス名の取得方法、もしくは他のよい方法があれば教示ください。
よろしくお願いいたします。
- たぶん、すっごく勘違いしてる。
けど、通常は tag を設定する。
- 説明不足ですみません。
仰せの通り通常はタグを設定して判別するのですが、
I.BでNSMenuにはタグが設定出来なかったので困っている次第です。
- あ、やっと大体意味が分かった。
アプローチが間違ってる。
- (void)menuNeedsUpdate:(NSMenu*)menu;
- (BOOL)menu:(NSMenu*)menu updateItem:(NSMenuItem*)item atIndex:(NSInteger)index shouldCan
cel:(BOOL)shouldCancel;
- (BOOL)menuHasKeyEquivalent:(NSMenu*)menu forEvent:(NSEvent*)event target:(id*)target act
ion:(SEL*)action;
この辺かな。
- Xcode 3.1でDocument-based Applicationを作っています。
MyDocumentクラスのmyStringをTextViewのAttributed StringにIBでbindingしているのですが、
自作のメソッドを実行するときに、myStringにTextViewの内容を反映させるにはどのようにしたらよいのでしょうか。
- myString=[TextView stringValue]ではダメ?
myString<->TextViewの双方向にバインディングするNSValueTransformerのクラスを書いて
バインディングの設定画面のvalueTransformerに定義するとか。
- >>630
なるほど、バインディングは双方向ではなく片方向ずつなんですか。
myString=[TextView stringValue];
でやることにします。ありがとうございます。
- >>629
myStringがNSStringならば、attributedStringにはbindできません。
NSStringをbindするならvalueとbindしなくてはいけません。
そのためには、Multiple fonts allowedをoffにする必要があります。
そうした上で、setMyString:やsetValue:forKey@"myString"を実行すればKVO(NSKeyValueObserving)が働きます。
bindingについて解説しているサイトや書籍を参照することをお勧めします。
- >>629
632です。ちょっと勘違いですね。
myStringにTextViewの内容を反映させるにはコントローラにcommitEditingを送信します。
- >>633
ありがとうございます。別途Controllerを作ってやる必要があるんですか。なるほど。
- >>634
頼むからドキュメントとサンプルちゃんと見てくれ。
人に聞くのはそれからだ。
- アプリが大きくなってきてメインのクラスの記述が非常に多くエディットしにくい状態です。
一つのクラスを複数ファイルへ分けて記述することは可能でしょうか?可能ならどのようにすれば良いでしょうか?
- >>636
カテゴリー
- ああ!なるほど
カテゴリって既存クラスの拡張ってイメージありましたけど、
確かに自作のクラスでも同じですよね、ありがとうございます。
- コンパイラにとって自作のクラスと既存のクラスって区別できないんじゃないかな
- >>636
そのメインのクラスが、どんなものなのか知らないけど、
リファクタリングしたら、複数のクラスに分かれたりはしないかい?
- >>636
させる仕事の役割をきちんと分類し、それを別オブジェクトにするもよし、カテゴリで分割するも良し
カテゴリで分けた場合、
main+Private.h、main+Private.m
などとファイルをわけるといいです。
- objective cでクロージャが使えるようになるらしいって、本当ですか?
- 2年くらい前には10.5のObjectiveC 2.0で導入されるという噂がありました。
それのことじゃないでしょうか。
- POCで使えなかったっけ?
- >>644
そうみたい。
ttp://users.pandora.be/stes/block98/index.html
Smalltalkっぽいスタイル?
- llvm-gccかclangが対応してくれます(きっと)。
- たのしいCocoaプログラミング[Leopard対応版]で
Hello World表示もできなかった
- >>647
さっぱりすぎワロタw
- >>646
ほんとうにclangが来てるwww
ttp://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html
gccへ提案してたのは前にあったらしいんだけど、こっちが先か。
確かにgccよりclangのほうが構文いじりやすいだろうし。
- >>647
どういうこと?
HMDTのサイトはよく参照するけど、本の方は出来良くないという印象。
- >650
単なる「私は馬鹿です」宣言でしょ。
Cocoa的Hello Worldは
XcodeでCocoa Applicationテンプレートからプロジェクト作って、
MainMenu.nibを開いてWindow上のテキストフィールドに
「Hello World」って入れて、保存して、
Xcodeに戻ってビルドと実行すればいいだけ。
- NSLog(@"Hello World");
これが動かないのか?
- stderr に出力するHello Worldはあんまり見ないよね。
しかも余計な出力付くし。
それがしたいなら printf("Hello world");の方が良いと思う。
- Foundation的に書いてみると、
[[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Hello, World\n" dataUsingEncoding: NSASCIIStringEncoding]];
ながいな。
- >>650
>HMDTのサイトはよく参照するけど、本の方は出来良くないという印象。
たのしいCocoa読んでみたけど、あれはプログラミング自体が初心者な人は
かなり置いてきぼりになる内容だと思った。多分>>647はそういう人。
>>651
言い過ぎ。
たのココ的HelloWorldはCocoaセミナー初級編と一緒だった。
1.AppControllerクラスを作る。
2.テキストフィールドのアウトレットと、sayHelloメソッドを宣言
3.IBでインタフェース作成、接続
4.XcodeでsayHelloメソッドの実装
5.ビルドと実行
>>647
Cocoaセミナーと内容一緒だから、あわせて見ておくのを勧める。
旧バージョンだが基本は同じだし、違うところは本を参考にすればいい。
ttp://developer.apple.com/jp/documentation/japanese.html
- そういえばヒレガス本第3版邦訳まだかな
- アプリのメインのクラスをAppControllerって名前にするのたぶん彼の流儀なんだけど
国内ですげー広まってる気がするw
Appleのサンプル見るとメインのクラスはプロジェクトの名前とかだよね?
- >>657
おれの流儀はXXAppDelegateだぜ。XXの部分はプロジェクト毎にサフィックスを決める。
プログラムを作る時にはサフィックスのXXを決めるのに一番時間がかかる(w
- × suffix
○ prefix
- Core Dataなアプリだと、
プロジェクト作成時に自動的に
"プロジェクト名_AppDelegate"ができるから、
それをメインのコントローラとして弄ればいいのか
- >>658
メインのクラスはだいたいNSApplicationのデリゲートを受けるかも知れないけど、
デリゲート使用しない時もあるよね
まぁ細かいとこだけど俺も名前決めに時間かかる、他のクラスとかでも
- >>656
漏れも、ヒレガス本は心待ちにしている。
- 質問です。どうにもIB上のBindingとControllerが良く分からないので、
HMDTの黒表紙を買おうかと思案中です。そこでお聞きしたいのですが、
本の内容で、よく理解できるような解説はあるのでしょうか?
お持ちの方、よろしくお願いします。
- 思案してても仕方が無いので、やっぱ買う事にします。
日記になってしまって済みません。
- >>657
NEXTSTEPのころのいろんなソースはだいたい
"プロジェクト名の略称Controller" って命名だった気がするよ
例えば UltraNature っていうプロジェクトだったら UNController とかね
>>664
2ch へのポストなど所詮みなの日記だもの
気にすることはないと思うよ
ちなみに何を読んだりどこまで自分でやって binding と controller がわからなかったのか
によってその本がためになるか変わるかも
- ヒレガス3rdの邦訳?
出るなら買うけど
出る予定なんてないんでしょ?
- >>666
>出る予定なんてないんでしょ?
ま、ないんじゃね。あれだけ図がついてりゃ訳なんて不要でわ
- まだ古い日本語版本屋に並んでるけど、さすがにもう・・・。地味に売れてたと
思うんで、いい加減新版出して欲しいものだ。英語版も買ったけど、やはり
時間がかかるわ、眠くなるわで、効率が悪い。
- Xcode 3.1
LSUIElement=1の、メニューバー(ステータスバー?)アプリを作成しています。
メニューバーのアイコンのメニューからopenPanel等を開くと、openPanelがアクティブにならないのですが、自動でアクティブにするにはどのようにしたら良いのでしょうか。
- -(IBAction)makeKeyAndOrderFront:(id)sender;
- >>670
NSWindowをアクティブにするときはそれでいけるかもしれないですが、NSOpenPanelをアクティブにするのにはどのようにしたら…
あと、- (void)orderFrontStandardAboutPanel:(id)senderで表示したAboutパネルもアクティブになりません。
- なんか邪道ですが、openPanelを開く前に
NSAppleScript *AS=[[NSAppleScript alloc] initWithSource:[NSString stringWithString: @"tell application ¥"アプリ名¥"¥nactivate¥nend tell"]];
を行うことでうまくいきました。
もっとスマートな方法はないのかな…
- >>672
[AS executeAndReturnError:nil];
を書き忘れ。
- それそのまんまのメソッドがあるわけだが……
- [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
でいけました…
- クラス階層
- ドラッグ&ドロップ中にコマンドキーなどが押されたら、
ドラッグ中のアイコンを変更できますかね?
ドラッグ開始時の自作アイコン表示とドロップ時の
キー押下判定は実装できたのですが。
- >>677
うーん。自前でイベントループを作って、自前でドラッグ処理を書く以外に、方法が思いつかない。
- すみません、質問です。
ファイルのダウンローダーを作成していて、保存ファイル名に自動でタイトルなどを付加しているのですが、
ファイル名に"/"が含まれている場合、ダウンロードに失敗します。
// デスクトップのパス
NSString *path = [@"~/Desktop" stringByExpandingTildeInPath];
// ファイル名を付加
NSString *fileName = @"xx / xx.txt";
path = [path stringByAppendingPathComponent: fileName];
// download は NSURLDownload
// "/"が含まれていると失敗する
[download setDestination:path allowOverwrite:NO];
fileNameを"/" -> "-"に置換すればOKですが、なんか格好悪い、
"/" -> ":" に置換してもFinder上では"-"で表示されます。
Finder上で"/"は入力できるので(内部的には":"なのですかね)
なにか良い方法はありませんでしょうか?
お手数ですがよろしくお願いします。
- ファイル名に/を使わないようにすればいいんじゃないか
- ¥/
- >>681
ありがとうございます。
NSMutableStringに入れて置換をかけてみましたが、
"バックスラッシュ+/"ではワーニングが出ました。
- >>682
普通に/を:に置換するだけじゃだめなん?
- 試してないしひどく適当なこと書いてるが「/」って単純にパスの区切りとして
扱われてるだけなんじゃね?デスクトップ上に「foo」ってフォルダ作っといて
NSString *fileName = @"foo/bar.txt";
ってしてやっても失敗する?
- 使おうとしているAPIで/はディレクトリの区切り記号だから
"xx/hoge.txt"をダウンロードしようとすれば
xxというディレクトリがないなら失敗するのは当然。
ファイル名として/を使いたければ,:がFinder上では/に見える。
ただ,古いAPIだと:が区切りになっていたので
自動的に別の文字に置き換えられる可能性もある。
一度別の名前でダウンロードしてから希望の名前に
リネームをかけるというのではダメ?
でもダウンロードしてくるファイル名に/が含まれる
ことなんてあるの?
- 凄く基本的な質問です
以前からメモに// もしくは/* */ でコメントアウトを使用していたのですが
#pragma mark もビルド時には完全に無視されると考えてよいでしょうか?
- ソースコードからNSButtonを生成して自作ビューの上に表示させたいんだけど、つまづいてます。
NSButton *aButton;
aButton = [[NSButton alloc] init];
[aButton setTitle:categoryName];
[aButton setTarget:categoryController];
[aButton setAction:@selector(loadFromCategory:)];
[aButton setBezelStyle:NSRecessedBezelStyle];
[aButton setHidden:NO];
[self addSubview:aButton];
[aButton setFrameOrigin:NSMakePoint(200, 200)];
ダメ出しお願いします。
- 何がどうダメになるんだい?
- あー、肝心なところを書き忘れてた。。
ボタンが表示されないんですよ。
- 指定イニシャライザはinitWithFrame:だね。
- 最初からもっと詳しく書けば良かったね。NSViewのサブクラス(CategoryView)を作っていました。
それをコントロールするクラス(categoryController)内の文字列がつまった配列を読み込んで、
その数だけボタンを生成したかったんです。
@implementation CategoryView
- (id)initWithFrame:(NSRect)frameRect {
if(self = [super initWithFrame:frameRect]) {
}
return self;
}
- (void)drawRect:(NSRect)aRect {
if(prevArray == categoryController.articleList) {
return;
}
for(NSButton *removeButton in [self subviews]) {
[removeButton removeFromSuperviewWithoutNeedingDisplay];
}
for(NSString *categoryName in categoryController.articleList) {
NSButton *aButton = [[NSButton alloc] init];
[aButton setTitle:categoryName];
[aButton setTarget:categoryController];
[aButton setAction:@selector(loadFromCategory:)];
[aButton setBezelStyle:NSRecessedBezelStyle];
[aButton setHidden:NO];
[self addSubview:aButton];
[aButton setFrameOrigin:NSMakePoint(200, 200)];
}
prevArray = categoryController.articleList;
}
@end
- >>691
長々コピペする前に1つ上のレスを見れば良かったね。
- >>690
ありがとー
- >>691
・とりあえず、drawRect:内で、subViewを追加している所がダメだ。subViewは前もって追加しておかなければならない。
・ボタンの数量が変わるということは、それに合わせて自身のViewサイズも変えなきゃダメじゃないの?
・どうしても、drawRect:のタイミングでしかボタンの数量が決定しないなら、NSButtonCellを使うとよいかもしれない。
・最終的に何を作りたいのか知らないけど、ボタンを並べるだけなら、NSMatrixを使ってみたら?
- タスクバーはまだですか?
- IBでUILabel のフォントサイズを変更しても、なんか画面上でうまく反映されてない気がするんですが気のせいですかね。
最初に配置したとたんはちゃんと追従するのに、一度フォーカス外しちゃうと駄目なきがしますが、いまいちよく判ってないかも。
- AutoSizeなんとかみたいなん入ってないですか?
FitToだっけか何か
- >>697
IBの話?Layout>Size to fit の事かな。
- たのcocoのHelloWorldでさっそくつまづいた。なんとか解決したけど。
.hファイルを編集するとあるが、どこにも「編集後に保存する」とは書いてないじゃないか。アイコンが灰色になってる意味すらわからなかったorz。
- >>699
あ、それおれも一瞬つまづいた。
わかってしまえばなんてことないんだけどね。
- ソースファイルを保存してないとそれはメモリ上にしかなくて
コンパイラが参照するディスクに保存してあるソースファイルは前のものだというのは
別に Cocoa に限った話じゃなくてコンパイラを使うプログラミングなら全部共通の常識だと思うのだが
- 君らはパソコンで文章とか絵とか書いても保存しないのか。
- >>701
いや、>>699はビルド時のことじゃないと思うよ。ビルド時には保存しますか?って聞かれるし。
多分Interface BuilderのほうにIBOutletとかが反映されるのが保存後ってとこじゃないかな。
たのcocoは買ってないけど、俺もXcode 3.xになってちょっと戸惑った。
- >703
ずばりその通りです。
「アクションとアウトレットの接続」が何度やっても接続できなかった。
- Xcode 3.xはIBで変更してもビルド時に保存するか聞いてこないってこと?
それはちょっと嫌だなあ。まだ2.xなもんで。
- じゃなくて、関連付けられたXcodeのプロジェクト内のファイルが変更されたら
勝手に見に行って追加削除されたIBAction IBOutletを自動的に同期するんだよ。
- 勝手に保存される方が気持ち悪くない?
- Xcodeのリファクタリングで、nibのoutletとかも、リプレースしてくれるのが嬉しい。
- >>701
ということを知らない初心者向けの本の話をしてるんですが。
- なるほど。
「ファイルとは何か。」
「保存すると何が起こる?」
ぐらいから始めないと何らかのクレームがつく訳か。
- >>710
そうじゃないだろ……。IBとXcode3.xがどういう連携を取っているかと云うのが詳しく説明されてないのが元凶で、編集した内容が保存しなくてもメモリを介して共有されると勘違いしてしまったって事だろ。
まあ、その誤解の仕方にも些か無理があるが……。
- >>710
大丈夫ですか?
- ていうか未だに2.xな人が多いのかな?この誤解されっぷりは。
- 開発は3.0でやってるよ。3.1に上げると古いCarbonのAPIが使えなくなるから。
今のところ64bit必要ないし。
- >3.1に上げると古いCarbonのAPIが使えなくなるから。
それは初耳... SDK を古い奴に設定かえてもだめなの?
- ライブラリに古いCarbonのAPIがないからリンク出来んという話だったと思う。
- うむー初耳だらけ。
3.1でCarbonいじってる。古いAPIを使っててコンパイラからdeprecatedを連呼されるが
連呼されるだけで一応コンパイルできてる。いい加減Cocoaで書き直そうと思ってるけどそれは
置いといてw
ライブラリがなかったら既存のバイナリも走らないし。
- XCode 3.1.1 が来てるよ。
- 実際AppleはいつまでCarbonを長らえさせる気なんだろうな?
Snow Leopardで切ってしまうのは少々過激な気もするし(PowerPCは切られるっぽいが)。
- CocoaとCarbonが全然基盤の異なる環境で、CarbonはOS 9との互換性のために残してある…
などと考えているならそれは間違いだと言っておく。
- >>720
それは分かってる。
両者混在可能だしiTunesとかFinderとか純正でもCarbon要素が多いソフトもあることだから。
- 最悪、Carbon.framework及び関連Frameworkをぶっこ抜いてきて、内蔵しちゃう。
- 最近のCocoaはスタック見てもCarbon呼んでないお。
CarbonからCoreServieに移ったのはあるけど。
- SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar);
これだけのためにCarbon使ってる。
これぐらいはCocoaに付けてくれ。 DockもAuoShowするようにして。
- NSTableColumnにNSImageViewを組み込み、
NSImageViewにローカルパスではなくURLから画像を取得する場合、
非同期で取得、表示させるにはどうするばよろしいでしょうか?
- 非同期で取得したいならNSURLDownloadで
- NSURLDownloadで一旦ローカルに保存せずに
直接NSImageを作成することは出来るのですか?
それらしい方法があればよいのですが。
- どの部分が分からないのか分からない
取得?非同期?表示?
- NSURLConnection
- NSURLConnectionで非同期で画像をNSDataとして取得して、
それをもとにNSImageを生成してNSImageViewに設定
- 現在はNSImageのfileContentOfURLでNSImageを作成しているのですが、
取得に時間がかかると固まったようになるのです。
テーブルカラムで一気に数行を表示させると、しばらく
ハングアップしたような状態になるのを
避けるにはどうすればよいかと。
お手数ですがお知恵をいただければと。
- >>731
>>730じゃだめなん?
- >>731
/Developer/Examples/PubSub/NewMusic/
のコードを見れば、>>730の実例がありますよ。
- みなさまありがとうございます。
家に帰ってからチャレンジしてみます。
- 普通にメインスレッド以外で読み込めば良いのでは?
- age
- 格闘すること4時間、ようやく非同期で画像表示ができました。
みなさま本当にありがとうございました。
- >>737
>みなさま本当にありがとうございました。
老婆心だがどうやったらできたかも書いとくといいぞ。
他の人の参考になるかもしれん品
- 相談したら解決法を書くのが礼儀かと
- ですね。失礼しました。
>>730さんの指摘の通りNSURLConnectionで非同期で画像をNSDataとして取得して画像を作成しました。
以下、主要なコード部分です。
- (void)getImage:(NSString *)imageURL
{
// リクエスト作成
NSMutableURLRequest *request = [NSMutableURLRequest imageURL
urlcachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30];
[request setHTTPMethod:@"GET"];
// コネクション開始
[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// データを受信したら imageData_に溜め込む
if(!imageData_) imageData_ = [[NSMutableData data] retain];
[imageData_ appendData:data];
}
-( void )connectionDidFinishLoading:(NSURLConnection*)connection
{
// 受信が完了したら画像を作成する
image_ = [[NSImage alloc] initWithData:imageData_];
}
- すみません、また質問です。
NSStringで参照渡しをするにはどうすればよいのでしょうか?
下記のコードだと、ログには空白で出てしまいます。
NSString *str1 = @"";
NSString *str2 = @"";
[self getString:str1 str2:str2];
NSLog(@"str1=%@, str2=%@", str1, str2);
- (void)getString:(NSString*)str1 str2:(NSString*)str2
{
str1 = @"aaa";
str2 = @"bbb";
}
なんか基本的なことですみません。
- NSString *str1;
NSString *str2;
[self getString:&str1 str2:&str2];
NSLog(@"str1=%@, str2=%@",str1,str2);
[str1 release];
[str2 release];
-(void)getString:(NSString**)str1 str2:(NSString**)str2{
*str1 = [@"aaa" retain];
*str2 = [@"bbb" retain];
}
こんな感じか
- 本題からは外れるが、そのメソッド名でownershipを渡してしまうのはどうかと思う。
- 文字列定数って解放されんの?
- >>743
[@"aaa" retain]するならcopyStringで
[@"aaa" autorelease]ならgetStringってこと?
そもそも返り値が複数の場合ってNSArrayとかNSDictionaryにしてやるイメージがあるけど、どうなんでしょ
- 「replacing NaN with 0.」というエラー(ウォーニン?)の対処方法を教えてください。詳細はこうです。
http://hmdt.jp/coral/index.htmlのcoral.appを改造しました。
コマンドで
./coral http://www.apple.com/jp/ipodnano/ -o ~/Desktop/test.pdf -p
とすると,問題なく終了しますが,
当のHMDTサイトだと,上記のエラーが16行出力されます。
./coral http://hmdt.jp/coral -o ~/Desktop/test.pdf -p
改造の趣旨は,PDFの出力をページごとにすることです。
(「PDFとして保存...」と同じことをコマンドラインからできるように)
いわゆるhtmltopdfとかHTMLDOCみたいで日本語可なものです。
このあとパッチを記載します。
- $ cat main.patch
*** main.m.orig 2007-06-02 18:05:48.000000000 +0900
--- main.m 2008-09-13 16:13:54.000000000 +0900
***************
*** 38,43 ****
--- 38,44 ----
int COOutputSizeHeight = 0;
BOOL COIsVerboseMode = NO;
BOOL COIsDialogMode = NO;
+ BOOL COIsPagenateMode = NO;
float COTimerTime = 0.0;
NSArray* COFormats = nil;
***************
*** 51,56 ****
--- 52,58 ----
fprintf(stderr, " -f/--format <format> Specify output file format\n");
fprintf(stderr, " -h/--help Print this help\n");
fprintf(stderr, " -o/--output <file> Specify output file name\n");
+ fprintf(stderr, " -p/--pagenate Output a pagenated file\n");
fprintf(stderr, " -s/--screen <width height> Specify rendering screen size\n");
fprintf(stderr, " -S/--SIZE <ratio> | <width height> Specify output image size\n");
fprintf(stderr, " -d/--dialog Use print dialog\n");
***************
- *** 245,250 ****
--- 247,261 ----
continue;
}
+ // Pagenate option
+ if ([tmp isEqualToString:@"-p"] ||
+ [tmp isEqualToString:@"--pagenate"])
+ {
+ // Set pagenate mode
+ COIsPagenateMode = YES;
+ continue;
+ }
+
// Verbose option
if ([tmp isEqualToString:@"-v"] ||
[tmp isEqualToString:@"--verbose"])
もう一つパッチがありますが,連続投稿できないので,しばらくお待ちを
- >>745
質問の内容に合うように回答してみたが、
自分なら >>742 みたいなことはしない。
- $ cat COController.patch
*** COController.m.orig 2007-06-02 18:11:17.000000000 +0900
--- COController.m 2008-09-15 16:05:25.000000000 +0900
***************
*** 39,44 ****
--- 39,45 ----
extern int COOutputSizeHeight;
extern BOOL COIsVerboseMode;
extern BOOL COIsDialogMode;
+ extern BOOL COIsPagenateMode;
extern float COTimerTime;
extern NSArray* COFormats;
***************
*** 290,301 ****
path = [[NSFileManager defaultManager] currentDirectoryPath];
path = [path stringByAppendingPathComponent:COOutputFileName];
}
! if (![data writeToFile:path atomically:YES]) {
! // Error
! fprintf(stderr, "coral: Failed to save data\n");
! [self _quit];
! return;
! }
// Quit application
[self _quit];
- --- 291,335 ----
path = [[NSFileManager defaultManager] currentDirectoryPath];
path = [path stringByAppendingPathComponent:COOutputFileName];
}
! if (COIsPagenateMode) {
! // For pagenate mode
! // fprintf(stderr, "coral: Pagenate Mode\n");
! // Create print info
! NSPrintInfo* printInfo;
! printInfo = [[NSPrintInfo alloc] init];
! [printInfo autorelease];
! [printInfo setHorizontalPagination:NSFitPagination];
! [printInfo setVerticallyCentered:NO];
! [printInfo setVerticalPagination: NSAutoPagination];
! [printInfo setJobDisposition:NSPrintSaveJob];
! [[printInfo dictionary] setObject:path forKey:NSPrintSavePath];
!
! // Load print panel
! COPrintPanelController* printPanelController;
! printPanelController = [[COPrintPanelController alloc] init];
! [printPanelController setWebView:_webView];
!
! // Active itself
! [NSApp activateIgnoringOtherApps:NO];
!
! // Run print operation
! NSPrintOperation* operation;
! operation = [NSPrintOperation
- >>749
ですよね
そして本人がいないという
- ! printOperationWithView:[[[_webView mainFrame] frameView] documentView] printInfo:printInfo];
! [operation setAccessoryView:[printPanelController view]];
! [operation setShowPanels:NO];
! [operation runOperation];
!
! [printPanelController release];
! }
! else {
! if (![data writeToFile:path atomically:YES]) {
! // Error
! fprintf(stderr, "coral: Failed to save data\n");
! [self _quit];
! return;
! }
! }
// Quit application
[self _quit];
以上です。
- >> 741です。
>>742 - 745 >>749
ありがとうございます。おかげさまでできました。
(NSString**)にして代入は*にすればいいんですね。
NSArrayやNSDictionaryの考えましたが、面倒くさいというか、
参照渡しができるはずだと思ったもので。
メソッド名はあまり規約は考えていません。(汗)
- - (void)drawRect:(NSRect)rect {
[super drawRect:rect];
[[NSColor whiteColor] set];
NSFrameRect(rect);
}
と書くのと
static NSColor *_white;
+ (void)initialize {
_whiteColor = [[NSColor whiteColor] retain];
}
- (void)drawRect:(NSRect)rect {
[super drawRect:rect];
[_whiteColor set];
NSFrameRect(rect);
}
と書くのでは
後者の方がパフォーマンス良いのでしょうか?
[NSColor hogeColor];
というのはその都度NSColorを生成していると考え方であってますか?
実際にはパフォーマンスというか、書き方としてどちらが正しいのか知りたいです。
- NSColorの内部で後者みたいなことがすでに行われているんじゃないかなぁ。
引数なしで呼び出せる色は代表的な色ばかりだし。
知らずに答えてるので、実際は知らない。
- やっぱ内部的にやってんですかねぇ。
ここ見て気になったんです。
ttp://hmdt.jp/cocoaProg/AppKit/NSTableView/NSTableView.html#section05
ここで使われてる
+ (NSColor *)colorWithCalibratedWhite:(CGFloat)white alpha:(CGFloat)alpha
の方なんかはなんとなく保持しておいたほうが良いような気がしますが、
おっしゃるようにwhiteColorなどの代表的な色ってどうなんでしょうね。
- NSMutableArray *array=[NSMutableArray array];
while([array count]<10000)
[array addObject:[NSColor whiteColor]];
とかやってみてObjectAllocとかでいちいちオブジェクトが生成されているかチェックすれば?
arrayに入っているオブジェクトのポインタを比較するだけでもわかるかな?
- InterfaceBuilderで設置したボタンを、ある変数の値によって
表示したり消したり(操作も無効に)させたいのですが
どうすればよいでしょうか。
こういう場合ソースコードからボタンを作らないといけないんですかね?
- ボタンのisHiddenにバインドするだけでいけるでしょ
- >>760
どうもです。それでやってみます。
- >>758
作ったarrayをretainしてアクティビティモニタで確かめてみたんですが、
whiteColorやgrayColorなどはメモリ使用量が全然増えず、
colorWithDeviceRed:1 green:1 blue:1 alpha:1
などだとメモリ使用量が増えました。
ObjectAllocを理解してないのですが、試してみたところ前者はあまり反応が無いのに対して後者はAllocateされまくってるようでした。
brownColorやpurpleColorなどシステムや標準のアプリに使われてない色でテストしてみると分かりやすく
初回呼び出し時のみAllocateされてされているようでした。
どうやらこれらはNSCachedRGBColorというカテゴリらしく勝手にうまいことやってくれてるようですね。
- >>746
俺にはいちいちこのパッチを当ててテストするパワーはないが、
とりあえずデバッガにかけてisnan()あたりでブレークするかやってみるとか?
- Objective-Cって拡張子cppなC++で書かれた関数って呼び出しできないの?
なんか参照できないみたいなエラーでる
- エラーの内容が曖昧だけどObj-C++なら混ぜられる。
拡張子はmm。
- CからC++の関数を呼ぶ時と同じ。
extern "C"でぐぐれ。
- fp = fopen( "test00.bmp" , "rb" );
でファイルtest00.bmpがあるにもかかわらず
失敗するのですが、ファイル指定方法間違ってるのでしょうか?
- ”何処に”有るのか分からない。
- 読んでもだめなら書いてみるってことで
ファイル書き込んだら、ユーザーのディレクトリ直下にファイルが生成されました。
そこにデータを置いたら読み込めました。
実行時カレントディレクトリがおかしかったみたいです。
わけわからん
- >>769
ワーキングディレクトリにファイルがあればパスを指定しなくてもいいが、
普通はパスも含めて指定するものだ。お前の方がわけわからんよ。
- >>769
わけわかってから先に進んだ方がいいよ
- >>769
NSBundle使うなら、それくらい適当な指示でも探してきてくれるんだが。
- fopen を使う意味が分からん
- なんかフルボッコされてる><。
>fopenを使う意味
ウィンドウズで書いてたプログラムをそのまま移植してみたんです><
Mac使用暦3日ですいません。
Mac使いこなしてから出直してきます。
- >>774
がんばって
- Cの標準ライブラリでソフト作るんならスレ違いだと思うよ。
- >>774
Macでプログラミング{9}
http://pc11.2ch.net/test/read.cgi/mac/1216824430/
や
【マック】Macintoshプログラミング質問箱
http://pc11.2ch.net/test/read.cgi/tech/1113058054/
の方がC言語標準でソフト作るのには向いているかも。
ただしどちらも適度に過疎っているのでそこが問題か。
- http://wktk.vip2ch.com/vipper103088.png
FinderやMail等で使用されている↑のUIを使いたいのですが、
どなたか方法ご存知のかたいないでしょうか。
- Recessed Buttonじゃない??
- >>779
ありがとうございます。Recessed Buttonありました!
あとは背景かぁ…
この背景のすこしカーブしているような感じはどうやってるんだろ。
オリジナル画像?
- .appのパッケージを見ると、ボタンのふちとか画像つかってるのがわかるよ
- 正式に売るアプリならパッケージの中の画像パクって使ってはいけないってうちの社の方針なんだけど、(Apple製のアプリでも)
やっぱ売り物に使うとまずいのかな?詳しい人いませんか?
- 何だって?
- >>782
Appleに問い合わせろ。
俺はダメだと思うけど、判断するのはAppleだからな。
- NSString *mailPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:@"mail"];
if(!mailPath) return nil;
NSBundle mailBundle = [NSBundle bundleWithPath:mailPath];
if(!mailBundle) return nil;
NSString *imagePath = [mailBundle pathForImageResource:@"hoge"];
if(!imagePath) return nil;
return [[[NSImage alloc] initByReferencingFile:imagePath] autorelease];
盗んでないもん!
- 質問です。
NSDictionaryのインスタンスに登録したオブジェクトの参照カウンタは
NSDictionaryのインスタンスのdealloc時にreleaseされるのでしょうか?
- それともdealloc時にremoveAllObjectsを呼ぶ必要がありますか?
- ない
- どうもありがとう!
すっきりしました。
× NSDictionary
○ NSMutableDictionary
- >>781
やっぱり画像ですか…
>>785
おぉ、その手がw
ありがとうございます。
- >>785
俺もそんな感じ
- しかしそれでは参照元が消えたら壊滅。
心を込めて1ドットずつ写せば問題なし。
- 他のメーラー使ってる人の中には
Mailを削除した人も居るんでない?
- まぁMailアプリは一例だろうけど
勝手に標準アプリを消すようなクライアントはあまりいないだろう
- 小さな画像に著作権は無かったような
- Appleとしても同じアイコン使ってくれた方が統一されて
うれしいと思うんだけどな。
というか、商用アプリでリソースパクりは山ほどあるだろ。
- http://service.shoppingfinder.jp/case/case01.html
Win用なのにモロパク
- 商売第一のヤツにオリジナリティの道を説くだけ無駄
- >>797
UIはOS X、アイディアは→ttp://hmdt.jp/icart/index.html
- >>797
こういう会社はやだな
- こういうヤな会社でも売れれば勝ちだからな。
こういうヤな会社に負けないにはどうすべきか考えないとな。
- うわ、ここまでやっちゃうか。
えげつないなあ
- どうせここまでやるならCocoaで開発しちゃえよ……。
- >>796
そういや、Appleから警告を受けたY'z Dockはリソースもパクってたな。
それがなきゃ警告はなかったかも?
- >>801
1行目>>そういう考え方もやだな
- iTunesみたいなUIをつくりたいんだがドキュメントのどこみればいいか分かりません。
だれか教えて下さい。
ちなみにつくりたいiTunesみたいなUIとは、
左ペインの部分です。
- >>806
ツリーかな?
- >>806
http://park15.wakwak.com/~concordia/cocoa_break/dev/src/ADCSamples/index.html
のSourceViewが参考になるのでは。
NSTreeControllerを使ってるので、ちょっと敷居が高いかもしれないけど。
- >>806
NSTreeController
http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTreeController_Class/Reference/Reference.html
R.Natori氏による使用例
http://d.hatena.ne.jp/RNatori/20080716
- みんな親切だね
- >>804
ま、あれはwidnows用だしね。
Mac用で同じリソース使ってくれたら統一感出してくれてありがとう
の一言だと思うけど。
ま、あくまでも憶測w
- NSURLの、
relativeStringとabsoluteStringの違いがよくわからないのですが、
具体的にどのようなときに違いが現れるのでしょうか。
- +[NSURL URLWithString:relativeToURL:]
-[NSURL initWithString:relativeToURL:]
を使ったとき意外は一緒です。
- >>813
ありがとうございます。
- 806です
>>807,808,809
ありがとうございます
- >>696 同じとこでつまずいた…orz
UILabelのフォントサイズを18以上にすると追従して大きくなるけど、そこから小さくできない。
うーむ
- Dock上の特定のアイコンの座標を取得する方法ってあるんでしょうか?
Stackみたいにちょうどアイコンの上にウィンドウが開くようなUIを作りたいのですが・・・。
- プロパティで
@property (readWrite, retain, nonatomic) NSObject *object;
とした場合
self.object = nil;
は
[object release];
もしくは
[self.object release];
と同義でしょうか?
- 久しぶりにプログラムいじってるんですが、quartzのCGLayerRef(スクリーン
外)にCocoaのメソッド使って描画してます。
CGLayerRefからNSContextつくって、それをsetCurrentContextで設定して
描画を行い、NSViewの次のdrawRect:の段階で画面上に描画しています。
10.4ではうまくいっていたんですが、10.5にすると、このメソッド以降描画がさ
れなくなります。
CurrentContextがCGLayerRefになったままなのかと疑い、以前のCurrentContext
を一次退避させて、描画が終わった段階で元に戻すと正常に描画されるように
なったんですが、これは正しい解決方法なんでしょうか。
どなたかアドバイスして頂ければ幸いです。
- Xcode 3.1です。
-(IBAction)openBrowser:(id)sender{
NSWindowController* wc=[[NSWindowController alloc] initWithWindowNibName:@"Browser"];
[wc showWindow:self];
[[wc window] makeKeyAndOrderFront:self];
}
新しく作成したウィンドウがアクティブにしたいのですが、上のソースでは表示されるもののアクティブになりませんでした。
ウィンドウをアクティブにするにはmakeKeyAndOrderFront以外にも何か必要なんでしょうか。
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
を追加してみたりもしてみましたが効果無しでした。
- >>820
基本的な確認だけども。
そのNSWindowControllerは読み込んでるNibの中でFile's Ownerになっている?
そのアウトレットがちゃんと目的のWindowに繋がってる?
- >>821
ありがとうございます。windowをアウトレットで繋いだらうまくいきました。
- >>818
ttp://www.stripe-net.jp/cocoa/program/blog20080511.html
- >>823
んはーありがとうございます。
ちなみに上記コードでreleaseした後に
self.source = hoge; で再設定しようとすると落ちました。
retainCountが0だからってnilではないんですね。
- iPhotoを起動するときにoptionキーを押しながら起動すると
ライブラリの選択が行えるわけですが、
同じように自前のアプリケーションでも起動時のキー判定を行うには
どうしたらいいんでしょうか。
- NSLog([[NSString alloc] initWithData:[[[NSString alloc] initWithString:@"=http%3A%2F%2F"] dataUsingEncoding:NSShiftJISStringEncoding] encoding:NSShiftJISStringEncoding]);
を実行してみると、
=http0X1.D1A1091104A28P-658-0.000000-1.992821
と表示されてしまうのですが、
「%3A%2F%2F」を含むNSDataを「0X1.D1A1091104A28P-658-0.000000-1.992821」ではなく「%3A%2F%2F」にする方法は無いのでしょうか。
initWithDataだけでなく、stringWithContentsOfFile:encoding:error:を試してもだめでした。
- >825
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/bathyscaphe/bathyscaphe/application/source/manager/DatabaseManager-Notifications.m?rev=1.9&view=auto
の一番下の
- (void)applicationWillTerminate:(NSNotification *)notification
でやってる。
これをApplication DelegateのapplicationWillFinishLaunchingあたりで。
GetKeys()はCarbonかCoreServiceに入ってたと思う。
- >>826
そもそもhttp%3A%2F%2Fがいけないと思うよ。
http://にしないと。
デコードするメソッドはググれば見つかると思う。
- >>828
そういう問題じゃないでしょ
>>826
NSLog(@"%@", [[NSString alloc]...);
NSLog の第一引数は format を指定するためのもの。典型的な security hole の原因だわ。
- >826
NSString *hoge = /* NSLogの中身 */;
NSLog(@"%@", hoge); // 第一引数に直接指定しない。
だと、どうですか?
NSLogの第一引数に直接指定してるのが問題です。
NSLogの第一引数はprintfとほぼ同じformat文字列ですので、
NSLogが%を解決しようとしてぶっ飛んでるんだと思います。
変換自体はそれでちゃんと出来ているはずです。
- >>826
あと、NSShiftJISStringEncoding で決めうちするのはよくないよ。
URL は ShiftJIS のばあいもあれば、 EUC の場合もあるし、
最近は Unicode もふえてるから、ちゃんとその URL を含む頁の
コードを判定してからやりましょう。
- 便乗ですみませんが、どうやって取得前に文字コードを判別できるのですか?
- >>829-830
ありがとうございます。うまくいきました。
formatを扱う時は気をつけます。
>>831
今回やろうとしていることの場合、NSString化するデータが日本語を含まないとわかっているため、NSShiftJISEncodeで決めうちしています。
>>832
http://blogs.dion.ne.jp/fujidana/archives/4169016.html
これぐらいしかわからない…
もっといい方法あれば良いんだが
- >>833
日本語を含まないことがわかっているのであれば NSASCIIStringEncoding にするべきでは
>>831
URL は %xx を decode しないなら文字コードは関係ないでしょ
- >>819
そうだよ。
10.4で問題がなかったのはたまたまでしょうね。
- >>835
遅くなりましたが、レスありがとうございます。
ひとまず安心しました。
DrawRect:が呼ばれる辺りでNSContextも再設定されると思ってたので意外です。
- NSViewをpdfにして(「PDFとして保存...」)プリントパネルを出さずに,保存したいと考えてます。
その際,プリントパネルでレイアウトのページ数/枚を2とか4とか設定するのと同様のことを
コードの中で設定したいのだがうまくいきません。
NSPagesAcross(横方向),NSPagesDown(縦方向)に整数をセットすればいい筈なのですが,
うまくいきません。
しかも,http://developer.apple.com/documentation/Cocoa/Conceptual/Printing/Tasks/CreatingPrintJob.html#//apple_ref/doc/uid/20000861によると
They still use the shared NSPrintInfo object if one is provided, but do not allow the user to modify the defaults.らしい。
アドバイスをお願いします。
念のためソースです。
NSPrintInfo* printInfo;
printInfo = [[NSPrintInfo alloc] init];
[printInfo autorelease];
[printInfo setHorizontalPagination:NSFitPagination];
[printInfo setVerticallyCentered:NO];
[printInfo setVerticalPagination: NSAutoPagination];
[printInfo setJobDisposition:NSPrintSaveJob];
[[printInfo dictionary] setObject:path forKey:NSPrintSavePath];
COPrintPanelController* printPanelController;
printPanelController = [[COPrintPanelController alloc] init];
[printPanelController setWebView:_webView];
[NSApp activateIgnoringOtherApps:NO];
NSPrintOperation* operation;
operation = [NSPrintOperation
printOperationWithView:[[[_webView mainFrame] frameView] documentView] printInfo:printInfo];
[operation setAccessoryView:[printPanelController view]];
[operation setShowPanels:NO];
[[[operation printInfo] dictionary] setObject:[NSNumber numberWithInt: 2 ] forKey:@"NSPagesAcross"];
↑ここで1枚あたり2ページを割り付けているつもり...
[operation runOperation];
NSLog([NSString stringWithFormat: @"%@" ,[[[operation printInfo] dictionary] description]]);
[printPanelController release];
- >>836
drawRectで再設定されるから良いという問題ではないですよ。
思わぬ所で上書きされる可能性もあるし、
currentContextかえたら元に戻すのが作法だと思います。
- >>837
NSPagesAcrossってNSPrintPagesAcrossのこと?
後こういう定数は「@"NSPrintPagesAcross"」じゃなくてそのまま「NSPrintPagesAcross」でいいと思う。
- >>839
アドバイスサンクスです。NSPagesAcrossとNSPrintPagesAcrossとの関係はつかめません。
NSPrintPagesAcrossにかえても,NSPrintInfoをダンプ(NSLog)は「NSPagesAcross = 2;」になってます。
しかも,期待した結果を得られないし,,,
[printInfo setJobDisposition:NSPrintSaveJob];としても
runOperation中では,無視されているみたいです。
- >>838
なるほど、言われてみればその通りです。
アドバイスありがとうございました。
- NSLogで出力したとき,日本語がエスケープされる(\U5185みたいになる)のですが,
エスケープされない方法か,コピペで,変換してくれるようなサイトがあったら,
教えてください。ちなみにこれはUTF8?UTF16?
- >>842
>ちなみにこれはUTF8?UTF16?
いわゆるNonLossyASCII。
- >>842
>>NSLogで出力したとき
問題があった時は自分で原因を狭めてしまわず、どういうことをしたらそうなったのかちゃんと詳しく書くべき
NSLogは日本語表示してくれる
ArrayとかDictionaryのdescriptionだと言ってるように変換されて表示される
君はそれを言ってるんじゃないかな?
まずは質問の仕方から勉強しようね
- ページ設定パネルで設定された結果(プリンタとか,用紙サイズ,方向など)を
チェックしたくて,
NSPageLayout *pageLayout = [NSPageLayout pageLayout];
runModalResult = [pageLayout runModal];
NSLog([NSString stringWithFormat: @"%@" ,[[[NSPrintInfo sharedPrintInfo] dictionary] description]]);
というのを差し込んでいるのですが,
ログには全然,パネルでの変更が反映されていません。
(デフォルトの設定がつらつらと出力されるだけ)
なんか勘違いしているみたいなのですが,その勘違いに気付けないので,よろしくお願いします。
- だから、NSLogの第一引数に直接内容不明な文字列を指定するなっていったじゃん。
と、全然別の所に突っ込んでみた。
- >>845
お前人の話し聞けよwww
そんでNSPageLayoutとかNSPrintInfoとか、
つかそもそもstringWithFormatとかdescriptionとかrunModalとか全部ドキュメント読んでこいよw
コード見てるとなんかどこじゃなくてたくさん勘違いしてるから
- NSLogの引数の中が全部デフォルトのものばかりかと。
変更された値を保持するオブジェクトを引数にいれないと。
- >>847
>どこじゃなくてたくさん勘違い
845はよーくドキュメントあたった方がいいぞ
- >>840
>>837のコードを参考に自分でもいろいろ試してみたんだけど、ダメだ。
カスタムのNSPrintInfo作って、それを使ってNSPrintOperationを動かしても全然一枚あたりのページ数が反映されない。
NSPrintOperationにパネル表示させて、一枚あたり2ページにしてやると正常に作動するのに、
その正常に作動したNSPrintInfoの内容と全く同じカスタムのNSPrintInfoを事前に指定してやると全然反映されない。
(多分>>837のコードは四苦八苦した後のものなんだろう。NSPrintOperation作った後に設定したりしてるから。
自分はNSPrintOperation作る前にNSPrintInfoに設定したけど、結果は同じだった)
CocoaBuilderで似たような質問が出ていないか捜してみると、いくつかあった。
http://www.cocoabuilder.com/archive/message/cocoa/2007/11/16/193220
しかし困ったことに回答が付いたものはゼロだった。
誰か正解を教えてくれ。俺が困ってるわけじゃないけど。
- >>849
お前さんもどこがおかしいのか分からないのかい?
おかしいってか意味の無いことをしてるなって感じだけど
- >>845
まずNSLogだが、これはstringWithFormat:と同じで第一引数にフォーマット、次から挿入する引数になる。
それを直すとこうなる。
NSLog(@"%@" ,[[[NSPrintInfo sharedPrintInfo] dictionary] description]);
次に「%@」だが、これは引数に指定したオブジェクトのdescriptionが挿入される。NSStringのdescriptionは自分自身。
それを直すとこう。まあ動作は同じなんだけど。
NSLog(@"%@" ,[[NSPrintInfo sharedPrintInfo] dictionary]);
だが俺の理解だと、sharedPrintInfoはカスタムのNSPrintInfoを指定していないNSPageLayoutや他のNSPrintOperationとは
共有されているはずだ。それの変更が反映されていないというのは腑に落ちない。
ていうかそこが本質なんだから、>>846-849はそっちも答えてやってくれよ。
- >>852に追記。
NSLog([[NSPrintInfo sharedPrintInfo] dictionary]);
これをやってはいけない訳はつまり、descriptionが返したNSStringの中に「%@」やなんかがあったらどうなるか?ってこと。
質の悪いバグになる。
- ttp://ja.wikipedia.org/wiki/%E6%9B%B8%E5%BC%8F%E6%96%87%E5%AD%97%E5%88%97%E6%94%BB%E6%92%83
これって、セキュリティホールになるのか。
- >>852
>ていうかそこが本質なんだから、>>846-849はそっちも答えてやってくれよ。
「NSLogの第一引数に生文字突っ込むな」とか分かりやすいとこばっかレスが付くのはねえ(w
>>845
Leopard以降だとNSPrintInfoからCore Printing(低レベルの印刷レイヤ)まわりにアクセスできるので、
それ経由でやればよさげ。
[operation setShowPanels:NO];
PMPrintSettings settings = [[operation printInfo] PMPrintSettings];
PMPrintSettingsSetValue(settings, kPMLayoutNUpKey, [NSNumber numberWithBool:YES], false);
PMPrintSettingsSetValue(settings, kPMLayoutRowsKey, [NSNumber numberWithInt:2], false);
PMPrintSettingsSentValue(settings, kPMLayoutColumnsKey, [NSNumber numberWithInt:2], false);
[operation runOperation];
とか(2x2の場合)。
NSPagesAcross -> kPMLayoutColumnsKey、NSPagesDown -> kPMLayoutRowsKey という
対応があるようで、これらは元のコードのようにNSPrintInfoからもセット可能なのだが、
kPMLayoutNUpKeyは直接的な対応はないようなので、Core Printingでセットしてやる。
CUIでNSPrintInfoを使うとkPMLayoutNUpKeyがセットされず、それが問題らしい。
- NSStringのrangeOfString:options:を使って、文字列の部分一致検索を処理してます。
アルファベットの大文字小文字、全角と半角、ひらがなとカタカナの違いを無視して一致させたいのですが、
ひらがなとカタカナを無視するオプションが見つかりません。
大文字小文字はNSCaseInsensitiveSearch、全角半角はNSWidthInsensitiveSearchが使えました。
どなたか、このあたりをご存知ないでしょうか?
- そんな日本語特有の処理が入ってるの?
- 印刷するアプリ作ったことない。w
>856
CoreDataの検索はひらがな、カタカナ無視してるから、
何らかの隠しオプションなりが有る可能性は有るけど。
enum CFStringCompareFlags {
kCFCompareCaseInsensitive = 1,
kCFCompareBackwards = 4,
kCFCompareAnchored = 8,
kCFCompareNonliteral = 16,
kCFCompareLocalized = 32,
kCFCompareNumerically = 64,
kCFCompareDiacriticInsensitive = 128,
kCFCompareWidthInsensitive = 256,
kCFCompareForcedOrdering = 512
};
CFのがそのまま通るかも。 kCFCompareLocalized ってのがあるけど使ったことない。
- >>856
全く調べてないし、その気もないけど、そんな日本人に都合の良いっていうか日本人くらいしか使わないようなAPIがあるとは思えない。
自前で文字列をどっちかに変換して検索するとかしかないんじゃない?
- >>856
ありがとうございます。
CFのオプションを試します。
ダメなら、CFの検索関数も試してみます。
- AppleScriptは一部ヴァージョンでひらカタ無視するらしいけど、まあCocoaには関係ないか……。
- 一部バージョンて
最新のAppleScript2.0のことでしょ
- iPhoneの連絡先も、かなを無視して絞り込むな。
やっぱ、CFあたりにあるんじゃないのか。
- >>856
ttp://blogs.dion.ne.jp/fujidana/archives/4410801.html
NSPredicateだから、メールなどの絞り込み検索にはともかくテキストエディタなどの文字列検索だとしたらニーズに合うかは分からないけど。
- 基本的な質問で恐縮ですが、
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
と
NSMutableDictionary *dict = [[[NSMutableDictionary alloc] init] autorelease];
では、どう違うのでしょうか?
下の方が解放してくれていい感じがするのですが、
明確に使い分ける意図があれば教えて下さい。
- 同じ
- そうですか、ありがとうございます。
これで迷わずにコードがかけます^^;
- >>867
ドキュメントのどっかをよめばかいてあるけど、
メソッド名に init... , copy... があるやつは autorelease されてなくて、
メソッド名にそれらがないやつは autorelease されてる、
と「決まってます」。
自分でメソッド書くときもそれに従っとくと混乱がすくないです。
- >>868
>>423
init は出てこない。
まあ普通は alloc と init の組み合わせで使うから、関係なくないといえばそうだけど。
- CABasicAnimationで画像を複数回移動するアニメーション部分をやっているのですが、
speed、durationなどの設定が同じならtoValueに設定した値までの移動距離が短くなるほど、
移動するスピードが遅くなります。(長くなると速くなる)
違った移動距離でも同じスピードで移動させたのですが、そのような設定は出来ますでしょうか?
毎回、speed、durationなどの値を入れ替えるしかないのでしょうか?
- >>859
無いという確信がどこから来るのか不思議だが、見事にハズレ。APIはちゃんとある。
CFでもUnicode UtilitiesでもLocaleとoptionを正しく与えれば、ひらがなとカタカナを
同一視した比較ができる。この動作をするのはJapanese Localeの時だけだから、
System Preferences > International設定の影響を受けたくなければLocale明示が必要
- >>871
別に確信を持って言ってるようには感じないけど。
いい感じ通信だったかな日本語文字列検索のこと書いてたけどこのオプションを使ってるのかな?
勉強になりました。
- >>871
kCFCompareLocalizedをオプションに入れて、
ロケールに日本語を入れれば良いという事ですか?
- >>873
CFStringCompareWithOptionsAndLocale()を使う場合はそう。
Leopard以前でLocale明示した比較をする場合はUnicode Utilitiesの
UCCompareText()を使う。
- すんません、古いOS持ってないので確認できないんだけど・・
例えばSDK10.4でビルドしたアプリって、OS10.3で起動したなら勝手にエラー出して終わるのかな?
それとも自分でチェックのコードを書かなきゃいけない?
- >>875
デプロイメントターゲットも10.4にしておけば起動しない。
俺は10.3にも対応してるアプリを書いてるが、SDKは10.4でユニバーサルバイナリ、デプロイメントターゲットは10.3。
- >>876
了解です、ありがとう。
- >>874
ありがとうございます。
- CocoaでSOAP通信しようとした時に、まず何から手をつければ(何から読めば)いいんでしょうか…
- >>879
私が参考にしたのはこれ
http://developer.apple.com/internet/webservices/webservicescoreandcfnetwork.html
- ふんふん、やっぱそれが一番いいですか!
ありがとうございます!!
- ローカライズ作業をしていたところ突如Xcodeが強制終了して
立ち上げ直したのですがなぜかローカライズがまったく反映されなくなってしまい
前日まで作業していた分も全てローカライズがはずれてしまいました。
Localizable.stringファイルを削除し新規に作り直したのですが、まったく反映されません。
試しに新規プロジェクトでローカライズしてみたところ、ちゃんと反映されました。
強制終了した際にプロジェクトファイルが壊れてしまったのでしょうか?
どこかXcode側で設定しなおしてみる項目などはありますか?
- 一番初めのObjective-Cプログラム - @IT
http://www.atmarkit.co.jp/fcoding/articles/objc/02/objc02a.html
- Xcodeが強制終了したので先入観でファイルが破壊されたのかと疑っていたのですが、
結局、事前に一度にたくさん編集していたLocalizable.stringファイル内でセミコロンが抜けていただけでした。
失礼致しました。
- Cocoa-Dev-Japan (GoogleML) が… ちょっお前、binding の前に KVC が…
とにかくHMDT本か荻原本読めよ、って感じになってる ヽ(#`Д´)ノ
- Xcode 3.1です。
Mail.appのspliter下部の、縦3本線が入ったもの(↓)を実現したいのですが、どのようにしたら良いのでしょうか。
http://wktk.vip2ch.com/vipper106389.png
- >>886
画像用意すれば?
- >>886
Bathyscaphe のコードを読めば?
- boolで設定できるようなメソッドなんてないからな
- 回答ありがとうございます。
>>888
BathyScaphe見てみます。
>>887,889
標準でCocoaに搭載されているわけでは無いんですか、了解です。
- ヒレガス本 (3rd ed.) 買ったら、なんとスクリーンショットが XCode 3.1 系になってた。びっくり。
- 日本語版出たの?
- あ、いや、英語版。新規ファイルの画面とか、iPhone 用... とかいう項目も表示されてて、ちょっと NDA 破っていたんではないかと思います。
- Document-based Application以外の方法で作ったプロジェクトに
あとからNSDocumentのサブクラスとMyDocument.nib追加しても
MyDocumentをインスタンス化してくれないのは、やっぱり
リンクしてるフレームワークが違うからなんですかね。
途中でドキュメントベースアプリケーションに切り替える方法って
ないんですかね
- Document-based Applicationとしては、最低限Cocoaフレームワークにリンクしてればいいはず。
Info.plistの設定が足りてないんじゃないかと。
新規Document-based Applicationプロジェクト作って見比べてみれば。
- 切り替えってか、最初に選ぶのはただのテンプレだから
>>895のおっしゃる通り、何かしらの設定が足りてないだけ
- >894
Info.plistの設定をする必要があります。
- 一度 [x] でウインドウを閉じた後、
Dockのアイコンをクリックして再度ウインドウを表示するには
どうしたらよいのでしょうか?
- ちなみに Cocoa Application で作成しています。
- >>895,896,897
なるほど。もうちょっと調べてみます。
- >>900
Info.plistを直接いじるんじゃなくて、
ターゲットの情報(プロジェクトじゃない)から設定するのが普通です。
空のDocument-Base Applicationを作って見て見るといいと思います。
- NSExpression/NSPredicate についてご教示ください。
NSExpression の expressionForKeyPath: と expressionForVariable:
って何が違うのでしょうか? それぞれ、NSPredicate predicateWIthFormat中の
%K、$ に相当すると理解しているのですが、$ ってどう使うのかガイドを
読んでもよく分からず(SQLを知らないから?)。やりたいことはできたのですが、
$ が分からないのが気持ち悪くて…よろしくお願い致します。
- SQLに'$'なんてあったかな?
Predicate Format String Syntaxにも$なんて出てこないけど?
- と思ったら書いてあるじゃん
Variables are denoted with a $ (for example $VARIABLE_NAME).
ちゃんとドキュメント読めよ。
- 言葉足らずですみません。ガイドやリファレンスは読んだのですが、その例が
理解できなくって。その、VARIABLE はどういったものになるのでしょう?
クラス変数は expressionForKeyPath: で取れて来るのは確かめたのですが、
expressionForVariable: でやってみると、'NSInvalidArgumentException'が
投げられて、reason: 'Can't get value for 'hoge' in bindings'、となりました。
'bindings' とあるので、controller に対して掛けるものなのかなぁ?とか、
考えたのですがよく分からず…よろしくお願いします。
- >>905
どこが解らないのか、理解できませんが、
Predicate Programming Guideの
Creating Predicates Using Predicate Templates
http://developer.apple.com/documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html#//apple_ref/doc/uid/TP40001793-219639-BCIIHDCH
を参照してください。
有効なpredicateにするにはpredicateWithSubstitutionVariablesでvariableを変換します。
- >>906
>どこが解らないのか、理解できませんが、
レスありがとうございます。うまく伝えられずごめんなさい。
以下のような事だと理解していいでしょうか?
・$hoge は述語の中の place holder みたいになっている。
・NSPredicate を実際に使うときに、$hoge の中身を predicateWithSubstitutionVariables
で(動的に)指定する。
・同じ処理を$... を使わない場合には、NSpredicate を個別にインスタンス化する
必要があるので、$... を使う方がよい。
ということですか?
- >>907
906です。
おおむね、その理解で良いのではないかと思います。
variableが有用なのは、特にdateです。
「dateが今日である」とか「dateが2週間以内」といったpredicateはvariableでないと作れません。
spotlight query には$timeが使えますが、それ以外では自前で作成する必要があります。
- >>908
なるほど、とてもすっきりしました。ありがとうございます。
自分の作っている物では、数値やboolの比較しかやってないので、その用途が
document 読んだにもかかわらず(汗、イメージすら出来ていませんでした。
ありがとうございました。
- NSStringに関する質問です。
hoge=[NSString stringWithString:@"test"];
を行った場合は、hogeはメインスレッド終了後解放され、
hoge=[[NSString alloc] initWithString:@"test"];
を行った場合はメインスレッド終了後も解放されないのはわかるのですが、
hoge=@"test";を行った場合はどうなるのでしょうか。
hoge=[NSString stringWithString:@"test"];と同様の処理になるのでしょうか。それとも違うのかな…
- メインスレッドが終了するとすべてのオブジェクトが破棄されます。
解放の処理は行われません。
てのは置いといて、
[[NSString alloc] initWith...]
と同じと考えておけば良いです。
- >>911
stringWith…
dictionaryWith…
arrayWith…
とかは、デフォでautoreleaseしているものだと思っていたのですが、違うのでしょうか。
initWith…と同等ですか、ありがとうございます。
- >>910
hoge=@"test" のretainCount を調べてみると良いですよ。
- >デフォでautoreleaseしているものだと思っていたのですが、違うのでしょうか。
ソースは、詳解Objective-C 2.0 P103
"一方、一時的に使われることを前提として、オーナーを持たない形で生成されるインスタンスもあります。
このような一時的なインスタンスは、生成直後に自動解放プールに登録することで実現されています。"
- 意地悪すぎましたか。
あなたが「メインスレッド」という名称だと思っているものは多分「メインランループ」です。
そうだとしても間違った解釈をしてますが。
メインスレッドというのは簡単にいっちゃえば、アプリケーションの実行の流れです。
これが終了するってことはつまり、アプリケーションが終了するってことです。
>911の始めで言ってるのは
「アプリケーションが終了したらオブジェクトはすべて破棄されます」
ってことです。
- >>915
ありがとうございます。
- >>910
ちょっと補足。
(Cocoaの)Obj-Cソースで@"test"と書いた場合はNSStringのオブジェクト定数というものになる。
つまり@"test"はそれ自体NSStringのインスタンスなのだけれども、releaseされてもretainCountは減らない。deallocもされない。
なので、hoge=@"test"と[[NSString alloc] initWith...] はautoreleaseされていないという点で同じだが、オブジェクト定数は
解放されないので全く異なる。
しかしプログラムの他の部分で、hogeがオブジェクト定数であることを前提にしたコーディングを行うのは良くない。
あくまでオーナーシップの原則に則るべきだから、stringWithString:の場合と同様に扱うのがいいと思う。
>>915の書き方も婉曲で分かりづらいので補足しておくと、アプリケーション終了時にはメモリは全て解放される。
autoreleaseしたものはメインスレッド終了時でもランループ一巡ごとでもなく、カレントのNSAutoreleasePoolが
解放されるときにreleaseされる。ランループは一巡ごとにNSAutoreleasePoolを作っては解放しているので、
標準ではランループごとにreleaseされるように見える。
自分でNSAutoreleasePoolのインスタンスを作った場合は当然ながらそれがカレントになる。
- >>917
ありがとうございます。オブジェクト定数で調べたら載っていました。
- というかそれぐらい基本的なことはまず聞く前に過去ログを呼んだ方がいい
- おーい、過去ログーっ!
- 呼んで見つかったら次は読んでね
- http://sankei.jp.msn.com/photos/culture/arts/080501/art0805011905006-p1.jpg
- うまいねえ、これでインスタンスかい?
- 10/15 付けの新ドキュメントをざっとながめてたんだけど、
http://developer.apple.com/documentation/Cocoa/Reference/NSTextInputClient_Protocol/Reference/Reference.html
ていう新 protocol がでてた。しかし
http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTextInput_Protocol/Reference/Reference.html
との違いがほとんどわかりません。詳しい方よろすく
- NSDictionaryをファイルに書き出す時に日本語文字列が
"\Uxxxx" のようにUnicodeの文字コードに変換されてしまうのを回避することはできないでしょうか?
PropertyListでなくてNSDictionaryのdescriptionInStringsFileFormatの形式で書き出したいのです。
NSStringやNSPropertyListSerializationを経由してどうにかならないかとやってみましたが解決できませんでした。
Property List Editor.appでファイルフォーマットをText Property Listにして書き出した場合も日本語は文字コードに変換されてしまうのでやっぱり無理なのでしょうか?
- 直接やる方法はわかりませんが、
単に NSDictionary のキーを keyEnumerator で列挙して、
それを徐々に NSMutableString かなにかにつなげていって、
ファイルに書き込みたい文字列をつくったら、
NSString の -writeToFile:atomically:encoding:error:
で書き込めばいいと思います。
encoding 指定は NSUTF8StringEncoding でいいと思います。
- ありがとうございます
とりあえず今それでやっていますが辞書がいれごになって複雑になると大変ですね;
自前のdescriptionとしてカテゴリにしておこうかな
直接的に変換しない方法もあればよろしくお願いします
- >>925
たぶんプロパティリストのシリアライズと関係があると思うけど、
key = value; 型のものは旧式 (OPENSTEP由来)のもので、基本的にASCII。それが¥Uxxxxになる
理由だったと思う。
今はなるべくXML形式かバイナリ形式でシリアライズすることになっている。
ローカライズに使う.stringsファイルはちょっと例外的で、UTF-8/UTF-16をそのまま使えるけど。
ちなみに¥UxxxxというやつはNSNonLossyASCIIStringEncodingというエンコーディングとして
定義されているので、NSStringとかでこれを指定して読み込めば本来のUnicodeに戻る。
>とりあえず今それでやっていますが辞書がいれごになって複雑になると大変ですね;
リーフノードが規約かどうかで再帰コードでも書いたらいいだけだと思うけど。
そもそも入れ子(?)になってたら、stringsファイル形式では表現できないような。
あ、上で書いたいわゆるOPENSTEP形式のプロパティリストで入れ子にしたいということかな。
- そうです、おっしゃる通りstringsファイル形式ではなくてNSPropertyListOpenStepFormat形式のプロパティリストファイルで、
かつ日本語表示させたいということでした。
説明していただいた文章を読むと、\Uxxxxはユニコードの文字コードがASCIIエンコーディングで表示されているということですかね。
そのあたり勘違いしていたようです。
複数のプログラム、プラットフォーム間でのデータのやり取りを想定しているので、プロパティリストではなく編集も容易なテキスト形式が好ましいかなと思い、かつ日本語表示もできるほうがいいよなと試行錯誤中でした。
XMLだと普通に日本語表示されるけど(PropertyListEditorなんかは除いて)テキスト編集が大変かなぁと、、
どうしたらいいのか分からなくなってきたのでもう一度やりとりするファイルの形式から考えなおしてみます。
Javaとか分かれば解決なんでしょうけどorz
- >>924
単純に、NSTextInputを機能拡張したものが、NSTextInputClientなのでは?
NSTextInputは、インフォーマルではない普通のプロトコルなので、メソッドの追加や変更ができません。
そのため、新しいプロトコルが定義されたのではないかと思います。
- >>929
プロパティリストっていってもただのXMLだから大体の環境で読み込みとか問題なさそうな気がするけど違うのかな?
まあ、簡単に編集ができると言う部分はちょっとだけ微妙かもしれないか。
- DOM面倒だし、YAMLとかにしたほうがいいのかな
- >>929
>そうです、おっしゃる通りstringsファイル形式ではなくてNSPropertyListOpenStepFormat形式のプロパティリストファイルで、
>かつ日本語表示させたいということでした。
というわけで、これ自体は、一旦OPENSTEP形式で書き出してからそれをNSStringに
NSNonLossyASCIIStringEncodingで読み込んで、最終的にUTF-8等で書き出し、でいいと思うけど。
クロスプラットフォームならむしろXML形式の方がいいと思うけどね.... Mac OS X以外の
環境でどういう処理をしたいのかによるけど。
- xml のパーサは OS X以外のどの環境でも最近は標準で備わっていたり、オープンソースであったりするので、UTF8 + XML でデータをやりとりするのがかんたんだと思いますよ。
OpenStep 形式のファイルのパーサを OS X 以外の環境で自前で書くのは車輪の再発明で無駄だというのに同意。
- みなさんありがとうございます。
今回PCに詳しくない人でもなんとかテキストエディタで編集できるレベルでと考えてたこと、
またProperty List EditorなんかはDeveloperが入っていないといけないというのと、
自分がWinの方でのXMLの処理についての知識が浅かったということで、XML形式でなくOPENSTEP形式にこだわっていました。
昨晩は結局自前のdescriptionを書いて日本語表示をちまちま実装していましたが、力尽きて寝てしまい起きて>>933氏の書き込みを見てやり直してみたら一瞬でできました。
ちなみにプロパティリストの書き出し時に関してですが、NSPropertyListOpenStepFormatは読み込み時にしか使えないため以下のようにしました。
- カテゴリを実装
@implementation NSString (CardDocument)
- (NSString *)UnicodeString {
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
return [[[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding] autorelease];
}
@end
NSString *string = [[hogeDictionary descriptionInStringFileFormat] UnicodeString];
NSLog(string);
[string writeToFile:@"/Users/admin/Desktop/hoge.txt" atomically:NO encoding:NSUTF8StringEncoding error:nil];
これでplistとして読み可能な形でテキストファイルに日本語表示のまま保存することができました。
NSLogで確認できますが、辞書の中身がちゃんと日本語で表示されています。
もちろん辞書に対してdescriptionでもいいですが、今回はOPNESTEP形式にしたかったのでdescriptionInStringFileFormatを用いています。
辞書の中にNSDateが入っていると書き出したファイルを読み込みできなくなるのでNSDateはdescriptionWithLocaleなどしておく必要があります。
そうするとProperty List Editorで開いた時にNSDateではなくNSString扱いになってしまいますが、Porperty List Editorから書き出し時にフォーマットをText Property Listにした場合も同じようにNSDateはNSStringに変換されてしまうので仕方ないかと。
とりあえずこれはこれで良いとして、XMLを使う方向での可能性も探っていきたいと思います。みなさま御助言ありがとうございました。
- カテゴリ内のメソッド名は UnicodeString とかいうめちゃくちゃ一般的な名前じゃなくて、
stringByInterpretingUnicodeEscapes
とかのほうがいいのでは ... 将来ソースコードみたときに判らんようになると思います。
- >>936
あそうそう、OPENSTEP形式だとさらに、いくつかの種類のオブジェクトがちゃんと扱えないという
制限があったはず。ひょっとするとNSDateもそうかも。
- http://blog.livedoor.jp/applebrothers/archives/51710722.html
Mac OS X Snow Leopard
Appleの次期 Mac OS X ”Snow Leopard”の Finder をCocoaベースに書き直されるそうです。
開発者に配布されていたビデルドの中には、Appleのアプリケーションの多くがCocoaベースになるみたい。
使う側はどんなメリットを享受できるの??
- >>939
微妙にスレチだが。
RubiscoとかがFinderでも使えるようになるとかじゃね?
- >>939
>>940が言うように
現状「Cocoaアプリ」に対してしか有効にならないようなInputManager・SIMBL系ユーティリティーアプリ(InputSwitcherとか)がFinderでも使えるようになるとか、
Finderに何らかの機能を追加するものが新たに現れてくるかも知れないとかかな?
- Cocoaになると、
情報ウインドウのテキストフィールドみたいに右クリックが効かないような
変態コントロールが消滅する。
- SafariやTerminalのタブUIをFinderについに持ってくるとか?
- 64bit対応
- >現状「Cocoaアプリ」に対してしか有効にならないようなInputManager・SIMBL系ユーティリティーアプリ(InputSwitcherとか)がFinderでも使えるようになるとか、
64bit 環境では InputManager は読み込まれないよ。すくなくとも Leopard では。No luck。
http://developer.apple.com/releasenotes/Cocoa/AppKit.html#NSInputManager
- HIToolBoxとは何だったのか
- うーむ。
CGImageからNSBitmapImageRepを作成して、ColorAtX: y:でピクセルを走査
して輪郭抽出をしようとしてるんだが、だいたい同じピクセルでColorAtX: y:がク
ラッシュする…
なんか忘れてるのかな…
- >>947
参考までにコードが見てみたい
- >948
長いのでrtfにしてアップした。素人なんで読みにくかったりしたらスマン。
ttp://www1.axfc.net/uploader/He/so/149527.rtf&key=hagehage
- >>949
俺のレベルじゃさっぱり解らん
CGImageRef imageRef = CGWindowListCreateImage(CGRectInfinite,
kCGWindowListOptionOnScreenOnly,
kCGNullWindowID,
kCGWindowImageDefault);
if(imageRef != nil)
{
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];
int kk;
int ii = -100;
while(1)
{
_++ii;
_if( [[bitmapRep colorAtX:ii y:ii] blueComponent] != 1.0f)
_{
__kk++;
_}
}
...
とやってxyに不正っぽい値を入れてみたがクラッシュしなかった
maskのreleaseが抜けてると思う
- >>947
これが原因かはわからないけど、大量にループを行う場合は、自分でNSAutoreleasePoolを作って、一回転するごとに解放したほうが良いよ。
- おお、皆さんありがとうございます。
>948
クラッシュしませんか。何が悪いんだろう。
デバッガ見てるとmach_msgなんちゃらってのが呼ばれることが多いです。
んでレインボーが戻らなくなる。
あと、ガベコレ使ってるんでmaskはreleaseしてやらなくて良かったと思うです。
>951
collectIfNeededでガベコレ起動してみましたが同じでしたorz
とりあえず今日は寝ます…
- colorAtXって糞重いだろ。
CGImageならそこからビットマップの配列を得て直接アクセスしちゃった方がいいよ。
もしくはシェーダー書いてCoreImageにやらせちゃうとか。
- とあるCで書かれたライブラリを使用してアプリを作ってるんですが、
そのライブラリの中でsyslogでログを吐き出している部分があります。
ログの吐き出す部分をNSLogで拾いたいんですが、どうすればいいんでしょう?
CからObjective-Cで書かれた関数を呼ぶのだと思うのですが、やりかたがわかりません。
- syslogdと直接会話してるから、通常の方法だと無理です。
トロイの木馬的手法が必要かと。
- ソースかきかえてしまえるなら、
syslog 読んでるところを
CFStringRef stringRef=CFStringCreateWithCString...
CFShow(CFStr("%@"),stringRef);
CFRelease(stringRef);
とかにしてしまえばいいです。
- >>955
言い忘れてました。すみません。
ライブラリをソースで持ってきて、手を入れまくってました。
syslogを呼んでいるところを書き換えて~と書くべきでした。
>>996
ありがとうございます。
ちょっと書き換えましたが、これでうまく動きました。
CFStringRef stringRef = CFStringCreateWithCString(kCFAllocatorDefault, str, kCFStringEncodingUTF8);
CFShow(stringRef);
CFRelease(stringRef);
CFShowでstderrに吐き出してやればよかったんですね。
勉強になりました。ありがとうございました。
- すみません。Cocoaというより、C/C++の質問なのですが、
Mac環境ということでお許しください。
.cファイル中では
errno変数を使ったコードのビルドにうまくいくのですが、
.cppファイルに記述すると
では以下のようなリンクエラーになってしまいます。
"__error()", referenced from:
どうも、C++としてコンパイルすると、定義が以下のようになっているので
__BEGIN_DECLS
extern int * __error(void);
#define errno (*__error())
__END_DECLS
関数ポインタのマクロとしてerrnoが扱われているようです。
しかし、この実装がみつからないとしてエラーになっているようです。
この実装はMacではどのライブラリに存在するのでしょうか。普通Cランタイムとかlibcだと思うのですが、訳が分かりません。
ちなみにXcodeのテンプレートはCocoaアプリケーションです。
- すみません。自己解決しました。
.cの時に自分で
extern int errno;
とか書いてたのをそのままにしてだけでした。
申し訳ありませんorz
- cocoa初心者なのですが、アクション/ターゲットについて質問です。
例えばNSButtonがクリックされるとIBで指定されたアクションを実行しますが、ターゲット側(NSButton)のソースでは、アクションについてどのように記述されているのでしょうか。
-mouseDownメソッド内で“指定されたアクションを実行する”のような処理が記述されていると
予想していますが、実際はどのようにアクションを認識・実行しているかが気になっています。
分かりにくい文章で申し訳ございませんが、よろしければお答えお願い致します。
- 960です。
すみません、自己解決しました。以後気をつけます。
- >>961
まあまあそう言わずにw ってゆうか自己解決したんだ。
>-mouseDownメソッド内で“指定されたアクションを実行する”のような処理が記述されていると
>予想していますが、実際はどのようにアクションを認識・実行しているかが気になっています。
Appleの中の人しかソースは見ることができないので、適当なところでデバッガをブレークすると例えば
#0 0x90912556 in -[NSTextField selectText:] ()
#1 0x9089ab03 in -[NSApplication sendAction:to:from:] ()
#2 0x9089aa40 in -[NSControl sendAction:to:] ()
#3 0x9089a8c6 in -[NSCell _sendActionFrom:] ()
#4 0x90899f1f in -[NSCell trackMouse:inRect:ofView:untilMouseUp:] ()
#5 0x90899772 in -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] ()
#6 0x9089902c in -[NSControl mouseDown:] ()
#7 0x9089776b in -[NSWindow sendEvent:] ()
#8 0x90864311 in -[NSApplication sendEvent:] ()
#9 0x907c1d0f in -[NSApplication run] ()
#10 0x9078ef14 in NSApplicationMain ()
#11 0x00001ffc in main (argc=1, argv=0xbffff6f4)
#0 が最終的に実行されたアクション(とりあえずテキストフィールドでテキストを選択するだけ)。
どうでしょう、想像通りだったでしょうか。
- 質問するまではわからないんだけど、質問し終わると
何故か解決方法がひらめくのはよくあること。
質問を書いてるうちに頭の中が整理されるんだろうね。
- >>963
いわゆるconfessional debuggingというやつね。それはまあいいんだけど
>ソースでは、アクションについてどのように記述されているのでしょうか
>実際はどのようにアクションを認識・実行しているかが気になっています。
という質問で、結局何が知りたかったのかなあと思って。
いろんなレベルの回答がありえると思うので。
- Pythonと連携した文字コード自動判別を試しています。
以下のソースを実行した際、変数sには"SHIFT_JIS"が入っていることを確認しているのですが、
[[encodingDB valueForKey:s] intValue]は、0が返されてしまいます。
[[encodingDB valueForKey:@"SHIFT_JIS"] intValue]では、ちゃんと8が帰ってきます。
考えられる原因はなんでしょうか…
NSTask* t=[[NSTask alloc] init];
NSPipe* p=[NSPipe pipe];
NSPipe* e=[NSPipe pipe];
NSData* d;
NSData* f;
NSString* s;
NSLog([[NSBundle mainBundle] pathForResource:@"chardet" ofType:@"py" inDirectory:@"chardet-1.0.1"]);
[t setLaunchPath:@"/usr/bin/python"];
[t setArguments:[[NSArray alloc] initWithObjects:[[NSBundle mainBundle] pathForResource:@"chardet" ofType:@"py" inDirectory:@"chardet-1.0.1"],[absoluteURL relativePath],nil]];
[t setStandardOutput:p];
[t setStandardError:e];
[t launch];
[t waitUntilExit];
f=[[e fileHandleForReading] availableData];
if([f bytes] != NULL){
s=[[NSString alloc] initWithData:f encoding:NSShiftJISStringEncoding];
NSLog(@"Python Error:%@",s);
*outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
return NO;
}
d=[[p fileHandleForReading] availableData];
s=[[NSString alloc] initWithData:d encoding:NSShiftJISStringEncoding];
NSLog(@"%@",s);
- //続き
NSMutableDictionary* encodingDB=[[NSMutableDictionary alloc] init];
[encodingDB setValue:[NSNumber numberWithInt:NSASCIIStringEncoding] forKey:@"ASCII"];
[encodingDB setValue:[NSNumber numberWithInt:NSISO2022JPStringEncoding] forKey:@"ISO-2022-JP"];
[encodingDB setValue:[NSNumber numberWithInt:NSJapaneseEUCStringEncoding] forKey:@"EUC-JP"];
[encodingDB setValue:[NSNumber numberWithInt:NSShiftJISStringEncoding] forKey:@"SHIFT_JIS"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF8StringEncoding] forKey:@"UTF-8"];
[encodingDB setValue:[NSNumber numberWithInt:NSUnicodeStringEncoding] forKey:@"UTF-16"];
[encodingDB setValue:[NSNumber numberWithInt:NSWindowsCP1250StringEncoding] forKey:@"windows-1250"];
[encodingDB setValue:[NSNumber numberWithInt:NSWindowsCP1251StringEncoding] forKey:@"windows-1251"];
[encodingDB setValue:[NSNumber numberWithInt:NSWindowsCP1253StringEncoding] forKey:@"windows-1253"];
[encodingDB setValue:[NSNumber numberWithInt:NSWindowsCP1254StringEncoding] forKey:@"windows-1254"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF16BigEndianStringEncoding] forKey:@"UTF-16BE"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF16BigEndianStringEncoding] forKey:@"UTF-16BE"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF16LittleEndianStringEncoding] forKey:@"UTF-16LE"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF32StringEncoding] forKey:@"UTF-32"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF32BigEndianStringEncoding] forKey:@"UTF-32BE"];
[encodingDB setValue:[NSNumber numberWithInt:NSUTF32LittleEndianStringEncoding] forKey:@"UTF-32LE"];
NSLog(@"%d",[[encodingDB valueForKey:s] intValue]);
- うちでは問題なく 8 が帰ってくるよ。
python 部分はためしてないけど、NSLog で s をみる直前で s=@"SHIFT_JIS" をいれて試してみました。
chardet.py の出力に改行がはいってませんか? SHIFT_JIS¥n みたいなかんじ。
- あと、手で dictionary を設定しないでも
CFStringConvertIANACharSetNameToEncoding
というのがあります。
というか、折角 python 読んでしまうのなら、エンコーディング判定だけにつかうんでなくて、
そもそも UTF8 に python で変換してしまって Obj-C のコード側は Unicode 扱うだけにしてしまえばいいのでは?
- すっごく初歩的な話で申し訳ないんですが、
QTMovieにsetRate:を渡すとその瞬間に再生まで始まるのはやめさせられないんでしょうか?
あと、一旦再生終了すると再生レートが1.0に戻っちゃう気がするんですが。
- setRate:のドキュメント読んでみ
- >>970
and so on.
(:I)rz その他って言われても・・・。
- setRate:0.0は停止
setRate:1.0は1.0倍速で再生
setRate:1.5は1.5倍速で再生
再生スピードのみを設定しているわけではなく
再生状態も含めての設定だったと思ったよ。
- exactly
- >>967-968
ありがとうございます。改行が入っていたのが原因でした。
s = [s substringToIndex:[s length]-1];
にて最後の1文字を除去したところ、うまくいきました。
CFStringConvertIANACharSetNameToEncodingってあったんですか…
- >>974
>CFStringConvertIANACharSetNameToEncodingってあったんですか…
そして NSShiftJISStringEncoding != SHIFT_JIS であることを知る、と…
IANA charset を使うということはもしかして html のエンコーディングを扱おうとしてる?
Windows で作った html には気を付ける必要があったりするかもねえ…
- 質問です。
サイトのfaviconを取得するにはどうすれば良いのでしょうか?
htmlから<link rel="icon" href="xxx" >を探し出すか、
ルートにfavicon.icoがあるか探し出すしかないのでしょうか?
もっと簡単な方法があればありがたいのですが。
- 何に使いたいの?WebKit すでに使ってるなら、
WebFrameLoadDelegate の一部として通知されるけど。
http://developer.apple.com/documentation/Cocoa/Reference/WebKit/Protocols/WebFrameLoadDelegate_Protocol/Reference/Reference.html#//apple_ref/doc/uid/20001910-CIABDIEH
- >>977
ありがとうございます。WebKitではあるんですね。
んー、当方はNSURLConnectionでHTMLデータ取ってきたり、
自作のブックマーク機能にURL文字列を登録した際にfaviconが表示できるといいなと。
- サブクラスを作った時に基底クラスを呼ぶべきものとその他の区別はどうやってつけてますか?
NSViewのサブクラスを作成したら
initWithFrameは[super initWithFrame:frame];が作成されてて
drawRectには無いですよね
リファレンスには何も書いてないように見えますが、initとdeallocだけ基底を呼んどけば良い?
- init...: と dealloc: にかんしては
http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_6.html
にかいてある。
それ以外の method に関しては、 super を呼ぶかどうかは
決まりごとじゃなくてどうしたいかでしょう。
-keyDown: で、動作を付け加えたいなら [super keyDown:]も呼ぶべきだし、
動作を完全にのっとりたいなら super はよばないほうがいい。
- Cocoaはさっぱり!!! version.11
http://pc11.2ch.net/test/read.cgi/mac/1224960170/
- >>980
なるほど、とりあえず呼んどくことにします。
- 梅
- 埋
- さらに梅
- うま
- 竹
- 梅さんと南先生はライバル!
- うも
- ここはMac界の名だたるフリーウェアの作者さんも多いんですかね?
- いいえ
- うみぇ
- 梅
ttp://mac.ascii24.com/mac/news/misc/2007/01/10/images/images831088.jpg
- 青い箱でアメリカ大統領の名前でローマ法王に電話をかける訳か>>993
- Cocoaはさっぱり!!! version.11
http://pc11.2ch.net/test/read.cgi/mac/1224960170/
- Cocoaはさっぱり!!! version.11
http://pc11.2ch.net/test/read.cgi/mac/1224960170/
- Cocoaはさっぱり!!! version.11
http://pc11.2ch.net/test/read.cgi/mac/1224960170/
- そうですか
- いいえ
- 1000ならObjective-C 3.0で
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
This page was generated by Dat2HTML Rev.