Objective-C [ObjC part:9];
■ このスレッドは過去ログ倉庫に格納されています
Objective-C(オブジェクティブ シー)はプログラミング言語の一種。C言語をベースにSmalltalk型のオブジェクト指向機能を持たせた上位互換言語。 (Wikipedia:http://ja.wikipedia.org/wiki/Objective-C より) 前スレ Objective-C [ObjC part:8.1]; http://mevius.2ch.net/test/read.cgi/tech/1414816517/ Objective-C [ObjC part:8]; http://peace.2ch.net/test/read.cgi/tech/1356341803/ Objective-C [ObjC part:7]; http://toro.2ch.net/test/read.cgi/tech/1330330906/ Objective-C [ObjC part:6]; http://toro.2ch.net/test/read.cgi/tech/1313891268/ Objective-C [ObjC part:5]; http://hibari.2ch.net/test/read.cgi/tech/1279730299/ Objective-C [ObjC part:4]; http://pc12.2ch.net/test/read.cgi/tech/1239721860/ Objective-C [ObjC part:3]; ttp://pc12.2ch.net/test/read.cgi/tech/1186543111/ Objective-C ttp://pc11.2ch.net/test/read.cgi/tech/1106983092/ Objective-C ttp://pc5.2ch.net/tech/kako/990/990574267.html 前スレ最後の方は 「ぼく電気工事士ですけど、ブレーカーとスイッチの違いってなんですかね? いつも電気ケトルでお湯沸かすのにブレーカーオンオフしてますけど?」 みたいでトリップ感あった。 メソッドに渡されるselfがclassのポインタかインスタンスのポインタかの違い って言ってもわからんだろうな わかりました! クラスメソッドはプロジェクトで1つしかインスタンスが持てない インスタンスメソッドは複数持てる ですね! つまりメソッドのロジックは同じで内部変数が違うものをいくつも同時に保持したいかどうかですね! 逆に面白い解釈で初心者に解説する時の勉強になる可能性? は無いか。 ここでNSObjctのインスタンスを見てみると objc_object という構造体であり 中には Class ってのがいるだけだ struct objc_object { Class isa OBJC_ISA_AVAILABILITY; }; Classってのはobjc_classと定義されているこんな感じの構造体だ struct objc_class { Class isa OBJC_ISA_AVAILABILITY; Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; }; そうインスタンスとはクラスを持っていてクラスはインスタンスを持っていないのだ クラスメソッドもインスタンスメソッドもクラス構造体の中で定義されていて呼び出せる範囲が違うだけなのだ そしてメソッドがインスタンスを持っているわけではなく インスタンスの中のクラスの中にある物を呼び出しているのだ これは構造はなくルールに近い話になる >>14 インスタンスメソッドも、メモリに確保される実体は一つだけ インスタンスをいくら作ろうがメソッドの実体は一つ selfが違うからインスタンスごとに確保されたように見えるんだろ? インスタンスを生成するごとに新たにメモリに確保されてるのはインスタンス変数 ロジックは1つで変数が複数ですね。 確かに無駄がないですね! ここは超人レベルの方ばかりで難しいんですが、親切なので助かりました! もう一つ聞いていいですか。 Self.hensuと_hensuって同じものですか? とりあえず全部_hensuで書いてます。 >>20 Self.hensuはゲッターが呼び出される 例えばこんな感じ -(id)hensu{ return _hensu; } これは @synthesize hensu = _hensu; としてインスタンス変数の_hensuを紐づけてると言う事 _hensuは直接_hensuを取る 取る時はそこまで問題にならないけど セットする時は@propertyでretainを指定してる時は @property (retain)id hensu; Self.hensu = obj; とするだけでセッターの中でretainしてくれるので _hensu = obj; とするより安全 色々自動で処理されて記述量が減った分、省略され過ぎて逆に分け分からなくなってる所は多い せっかく値保持したくてretainにしていても_hensuにセットしてたら効果なくて、アプリが落ちるかもってことですね! うわー、今までたくさん書いてきちゃった 例えばこうしたら @interface test(){ int _iHensu, _hensu; } @property (assign)int hensu; @end @implementation test @synthesize hensu = _iHensu; - (void)test{ _hensu = 10; _iHensu = 90; NSLog(@"h1 %d", _hensu); //10 NSLog(@"h2 %d", self.hensu);//90 } @synthesize で hensuに_iHensuを登録すれば self.hensuで呼び出されるのは_iHensuになる感じ これはプリミティブ型のintだからassignだけど オブジェクト型のインスタンスを MRRチックに自分でretainするならセッター使わなくても問題ないよ もちろんreleaseも必要 セッターゲッター使うとそれを省略出来るってこと retainもセッターの中で こんな感じの関数が呼ばれるだけだから - (void)setHensu:(id)value{ if(_iHensu != value){ id oldValue = _iHensu; _iHensu = (value != nil ? [value retain] : nil); if(oldValue != nil) [oldValue release]; } } 知り尽くしてますね! コツコツ_をselfに置換する方向でいこうかと思います(泣) ただ処理速度の観点からいくとクリティカルな部分ではゲッターの関数呼び出しより 直接インスタンス変数を呼んだ方が良い場合もあるセッターもしかり 自分でコントロール出来るなら出来合いの関数を使わない方がスマートだったりする あと @property (assign)int hensu; と登録してる場合は自動でソースにセッターも追加されてるから 関数を書かなくても [self setHensu:10]; と self.hensu = 10; は同じなんだけど前者の書き方の方が都合がいい場合もあるから覚えとくと良い 自動入力での候補から入力した場合も数値まで行くから多少速い気もするし (これは慣れかもしれないけど ちなみに@property setter =やgetter = で呼び出しの関数を変える事も出来るよ こういうのを覚えておくとセッター関数をオーバーライドして同期処理を追加したりして KVOを登録しないでKVOチックな事が出来たりする あ、ちなみにオブジェクト型の個別のretain とか release はMRCでの話で ARCだとまた少し話が変わってくるわけだけどもね そんなに気にしなくても美味い事やってくれますよ彼女なら X MRC O MRR - Manual Retain Release こんな感じに理解してたんですけど合ってます? -initWithString インスタンスメソッド。allocしないと使えない。あとでreleaseが必要。 +stringWithString クラスメソッド。allocしなくていい。 autoreleasepoolに登録された状態のインスタンスが返るので、 releaseしなくていい。 ARCだと、「releaseしなくていい」という コンビニエンス・コンストラクタのメリットが薄れた。 (気軽にallocしちゃってもメモリリークしない) >>30 今時Obj-CでMRRを使う場面は無いと思うが、参照カウント方式は基本なので教えると Obj *obj = [[Obj alloc] init]; “init”から始まる、名前がlower camel caseのインスタンスメソッドは、retain済みのオブジェクトのポインタを返す これを「initファミリー」と言い、この命名規則を守れば自作メソッドでも自動的にretain済みを返す 変数objはただのポインタで、-initから返る上記のポインタ値を代入してるだけ retain済みなので使いおわったら-releaseを呼んで解放する AppleのAPIの、いわゆるコンビニエンスコンストラクタはautorelease済みのオブジェクトを返すので、releaseしてはならない その場合main()のautoreleasepoolに登録されるので解放されるのはアプリ終了時になる 解放のタイミングを自分で制御したい場合はinitファミリーを使うかautoreleasepoolで囲うかする必要がある { initファミリー/retain } と { release } は対で使うこと View *view_ = [[View alloc] initWithFrame:CGRectMake(0,0,100,100)]; [self.view addSubview:view_]; [view_ release]; //上記initWithFrameと対 これはself.viewがview_をretainして保持するので、以降直接参照しないのならここでreleaseしても良い self.viewはselfが解放されるときに解放され、その時にview_にもreleaseが呼ばれる //self.view側で呼んだretainと対 対で使うのが大原則なので、例えば @property (retain) id obj; というプロパティを持ったクラスなら必ずそれをdeallocでreleaseすること - (void)dealloc { [_obj release]; [super dealloc]; } こんなことを全自動でやるのがARCなので、普通はARC使うけどね でARCとは、ビルド時にretain/releaseの行を、strong/weakに応じて挿入するだけで実現できているのだ シンプルだね >>31-34 詳しい説明ありがとうございます! 自作メソッドでも、initから始めると自動的にretainされるのは 知らなかったです。 あと、main()のautoreleasepoolが解放されるのは アプリ終了時、というのも分かってなかった…。 ARCがない時は、メモリリークが怖くて、 コンビニエンス・コンストラクタばっかり使ってましたけど、 あんまり意味がなかったのかも…。 今はARCのおかげで、何も考えずにallocとかnewできて 楽になりました。 複数のhファイルで同じ#import~をたくさんかくと何かデメリットがあるのでしょうか? わかりやすくmで使っているものをそれぞれ全部書くべきか、書かなくてもビルドが通るなら書かない方がいいのかベストは何でしょうか。 >>37 #include 使ってた人は 重複定義とか循環参照とかでビルドエラーになった経験があるからね #import でも#include時と同じように気を付けるってだけ 実際#importは多重インクルードしない機能があるから問題ないけど ソースが汚れるし参照でエラーが出る事あるしで無闇にimportしない 必要な物だけimportして 親子関係をしっかり考えたコーディングを心がけましょうってこと AViewcontrollerを開いたあとに、BViewcontrollerを開くと、Aでimport たファイルはBでしなくてもビルドが通るので書かない方がいいのかなとモヤモヤしてました ヘッダで必要ならヘッダでimport、ソースで必要ならソースでimport ヘッダにはimportせず @class の登場も多い すれ違いだったらすみません。 dudReciveMemoryWarningの活用方法って何かありますでしょうか? 今必要でなくて再取得/再計算できるものは解放するんや せやないとクラッシュする するarcの場合は自動なのでやることはないとうことですか? または配列にnilを入れたりすることも効果ありますか? strong変数にnilを代入してメモリを解放 NSArrayは要素をstrongで保持するのでNSArrayごとnilにすれば解放される ただでかいメモリ食うのは主にビューなんで、表示してない不要なビューは解放するのが効く つうか、ビューは必要な分を動的に生成が基本だろ そもそもそのメッセージ飛んできたらユーザーに再起動を促すね俺は >>46 Viewを動的作成しておいて解放は効果ありそうですね。 Tabだったら他のViewcontrollerを解放することは可能でしょうか? 確かにこまごま対処するより再起動なら間違いないですね cocoa event handling 難しいです。 Windowに置いたAVPlayerViewのjkl キーナビゲーションをカスタマイズ=潰したいです。 別のViewを配置して、NSResponderのkeyEquivalent系メソッドでキーコードのjklなNSEventをぶんどれば良いのでしょうか。 AVPlayerViewは、acceptFirstResponderにYesと返してくるのに、Viewをクリックしてもfirstresponderにならないので悩んでます。 AVPlayerViewのサブクラスを作って、その(キー)イベントハンドラでやればいいんじゃないの。てかそれが普通で簡単確実じゃないかなあ。もしくはMethod Swizzlingでとか NSResponder云々はResponder chainを理解してなさげ。奪うとかよりも取りこぼしを拾うような感じで、やりたいような処理機会を奪うのはムズいだろう もう少し教えて下さい。 event handling guideを読み進めたのですが、keyboard eventの場合には、最初にperformkeyequivalent がWindow上の全viewに対して一通り呼ばれて、 その後にmenu barのショートカットが評価され、 それでも該当しない場合に初めて keyDown:をresponder chainへ投げる流れに進む、 と理解したのですが、正しいでしょうか。 この理解ですと、acceptFirstResponder/responder chainが意味を持つのはキーイベント処理のかなり後になるように思えます。 viewが実装しているキーボード処理をoverrideする場合 親クラスがkeydownのみ実装していると仮定するのは 微妙かなと感じたのですが、AppKitではkeyequivalentでは実装しない、そういう前提で書くのが正しいのでしょうか。 読んだだけだろ?テストしたらわかるよperformKeyEquivalent:の意味が ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ performSelecterで複数の引数を指定するにはどうすればよいですか? performSelector:withObject:withObject: ありがとうございます 3つからは配列しかないでしょうか ドキュメントのニュアンス的に書いてあるようにperformSelector:は簡易版のようなもので、本来NSInvocationを使うのが筋だと思ってる まあ、NSInvocationはめんどくさいから普通に>>59 のいうやり方にするけど NSInvocation使ってperformSelector:のオレオレバージョンメソッド追加したりも簡単だけど、それもあんましないな 他で既にたくさん呼ばれている関数の引数が3つ以上だと使えないですね。 Timerで代替できるけど、ちょっと流れが読みにくくなっちゃうんですよね progressviewを読んでも表示されないときに、処理を一旦をOSに返し?表示させるために使ってますが、他の良い方法はありますか? performSelector:withObject:withObject:... の、ただ引数が増えましたバージョンはNSInvocation使って普通にできたな Timer〜処理を一旦をOSに〜がafterDelay:付きのような気ががするが、そもそもそれは複数引数なんてないしな afterDelay:付きはcancelPreviousPerformRequestsWithTarget:selector:object:をどう実現すんのかわからんが、それいらんのだったら同じくでできる 単に次のrunloop cycleで処理を実行させたいということのような気がするんで -[NSOpeartionQueue addOperationWithBlock:] でいいんじゃないかな (あれば、だけど) キャンセルというのがあるんですね! 初めて知りました。 addOperation試してみます。 勉強になりました。 ありがとうございます。 今日からObjective-Cを勉強し始めた初心者です OSX/macOS用のデスクトップアプリの製作を目標にしています ファイル出力で躓いている点がありアドバイス頂けませんでしょうか NSStringのwriteToURLでテキストファイルを出力したいのですが、Callback関数内で実行すると EXC_BAD_ACCESSエラーになってしまいます 試しにコピペでCallback関数の外で実行するとエラーになりませんでした。コードはこんな感じです NSString *hoo = @"test"; [hoo writeToURL: savePanelURL atomically:true encoding:NTUTF8StringEncoding error:nil] savePanelURLはsavePanelで入力しています USB機器に1byte送信して、その結果をCallbackで受信したら受信結果をファイルに書き出すのが目的です ご助言お願いします すみません、上の質問は取り下げとさせて下さい スレ汚し失礼しました 67です。改めて質問させて下さい savePanelで保存ファイル名を入力したらUSB機器に送信し、Callbackで結果を受信したらそれを ファイルに出力する、と言う処理を考えています savePanelから得たURLを直接Callback関数に渡す事は出来ないので一旦publicな変数に 格納していますが、Callback関数がこのNSURLを参照するとEXC_BAD_ACCESS例外に なってしまいます。Callback関数内でNSLog()でNSURL変数を参照すると例外が発生しました callback関数が別スレッドで動いているからでしょうか?しかしながら、unsigned charの配列 なんかは問題なく参照出来ています。クラスインスタンスだけだめなんでしょうか。 解決方法についてご助言頂けますと幸いです Callbackにデリゲートも持たせる iokitのUSB関連のコールバックは基本そういう設計になってる 情報量が足りないから推測するしかないけど、メモリ管理がきちんとできてなくて public な変数とやらがdangling pointer になっているような気がする >>70 ありがとうございます。Delegateですか・・・ グーグッて見たんですが世の中のサンプルは全部delegate側と被delegate側でクラスが分かれてる 例ばかりで、以下のような1つのクラス内でdelegateをデリゲートする方法が分かりませんでした・・・ @interface hoo : NSObject { NSURL *url; } - (void) sendUSBData; static void receiveUSBDataCallback(・・・・・・); @end sendUSBDataの中でurlを設定した後にUSB機器に向けて送信しています。その際にCallbac関数に receiveUSBDataCallbackを指定します Callback関数内で受信結果をファイルに書き出したいのですが、 NSLog(@"%@", url) ; と書いた行でEXC_BAD_SCCESSになります これ単にコールバック関数まで来たときには既に NSURL *url が消えてなくなってるんと ちゃうの? hoo のインスタンスをどうやって receiveUSBDataCallback に渡してるの? @interface hoo ... @end の中に入れてることから、そこに入れても hoo と全く無関係な単なる Cの関数 だとは思ってなさげ hooで自信のインスタンスを返すクラスメソッド作っておけば良い そこからhooを取得してurlを渡すゲッターメソッドも作っておけば良い それだけの話でしょ Callbackにユーザ定義ポインタ(void *)あるんじゃないの 何使ってるのか知らんけど、USBなんちゃらRecieveなんちゃらだったかは、Callback登録するときに一緒に渡して、Callback呼ばれる時にはそれが引数と渡ってくるようになってたようだけど であれば、それでurlだのfooだの渡すだけじゃね ああ、EXC_BAD_SCCESSなら、それやってて意図せず(ARCをよくわかってないと)に、元のインスタンスがCallback呼ばれる時にはすでにdeallocされてるとかありそう 基本的なiokitの設計ならコールバックはそうなってるけど libusbとかでやってるなら話は変わってきそう 皆さんはキーボードはUS使ってる? 私は場所によってUSだったりJISだったりするんだけど objcの場合@や{}[]使う事が多いからjisの方が書き易い気がしてきた どうなんだろ >{}[]使う事が多いからjisの方が書き易い これがイミフでそういう話には進まないな USキーボードってかな入力できるの? ローマ字変換のみ? >>83 できるけどキーの数足りてないので何らかの割り当ては必要 両方つかったけど あまりかわらない 慣れかな インテリジェンスだし そんな連続でキーパンチ続けないし 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 4NUVT 今のObjective-C本はMacOSXでアプリ開発する前提の本ばかりで読みづらい GNUstep上で環境作れば少しはマシになる MAC OS COCOA プログラミング(4版)っていう解説書(XCODE 4.5準拠)で macOSのcocoa Appのプロジェクトを作成してナビゲーターでて xxx.xibを選択してAssistant editorを表示するとAppDelegate.hが表示され@property (assign) IBOutlet NSWindow *window; @end が挿入されるって書いてある(Page 109)んだけど うちのXCODE 10.2の環境だとxibを選択して「View」メニューからAssistant editorを表示すると AppDelegate.mが表示されてそこに @property (assign) IBOutlet NSWindow *window; @end が追加されてるという妙なことになるんだけどAssistant Editorの表示を変えられる設定とかあるの?それともXCODE1Oの仕様? 本が古い、その対象のXcodeが古い。たぶん、Xcode 10よりもずーっと前に変わったとこかな 無名カテゴリ @interface AppDelegate () @end ってのが、4.5 の後のどこかで使えるよになって、パブリックでないものは、.m に書く書けるようになったので、.h ではなく .m になったのだよ Xcode 4.5ってよくそんな古い本探してきたな。 https://www.amazon.co.jp/MAC-OS-X-COCOA プログラミング-第4版/dp/4501552700 https://www.tdupress.jp/book/b350041.html 普通に現役として売っていたり。うーむ...よく売るな...ないよりマシというのもあるかもしれないが。中古でも結構いい値で売ってるし 東京電機大学出版局か...Xcodeの部分くらい書き換えてもよさそうだが。執筆者もそのくらい勝手にやるのを認めるだろう。東京電機大学と銘打っているなら https://www.amazon.com/Cocoa-Programming-OS-Ranch-Guides/dp/0134076958 原本は5版だな。April 24, 2015とびみょうだけど(たぶん無名カテゴリに対応はしてるかな)。何年もほったらかしで古いのは売るのね 1907年(明治40年) 電機学校創立。 1914年(大正3年) 電気雑誌『オーム』(OHM)創刊。 1922年(大正11年) 電機学校出版局の雑誌部が独立し、オーム社となる。 オーム社関連なのか。がっかりだよ。古き良き(よくない)日本の技術出版社(が出す日本語版)らしいけど このスレ過疎ってたのでレス付くか心配してたんですけど皆さんレスありがとうございます 確かに参考書は古本を買いました 色々調べたけど、Objectibe-CでmacOSの開発参考書で新しいの見当たらないんですよね 英語版の5th edition も入手したんですが、アプリのコーディングは言語がswiftになってました 最近のXCODEの参考書はiOS/Swiftだけみたいですね macOS/Object-Cでの開発は消えていくんですかね macOS/Object-Cを勉強する良い参考書/サイトなんかあれば教えてください 純粋にObjective-Cの話題とは言えないですが、もしよかったらアドバイスをいただけると ありがたいです。 マイナー言語の独自IDE上で、Cocoaブリッジを使ってIMによる日本語のインライン・インプットが 出来るようにしようとしています。必要に迫られてObjective-Cに対応するコードを書いてはいますが、 Cocoa や Objective-C のプログラミングの経験はほぼありません。 setMarkedText:selectedRange: で渡される変換途中のNSAttributedString文字列を、 attribute:atIndex:effectiveRange: を使ってビジュアル的にはアンダーラインの切れ目で表現される 変換文節に分割しようとしているんですけど、attribute: への NSUnderlineStyleAttributeName や NSUnderlineColorAttributeName の指定では切れ目のところでも同じアンダーラインが連続している という扱いになってしまう様で、期待通りになりません。 そもそも、日本語変換中の(同じ細さの)アンダーラインが切れている様子は NSAttributedString の アトリビュートの指定で実現可能なのでしょうか。 またそれが出来るとして(←出来るのだろうと思いますが)、その切れ目の場所を知ることは出来ますか。 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextAttributes/Concepts/AboutTextAttributes.html#//apple_ref/doc/uid/20001804-BBCFEBHA Temporary Attributes で指定して drawUnderlineForGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin: で描画するコードを書く かな Cocoaブリッジを使って〜とかなんで自分でやらなきゃならない&どこまでCCocoaなのかわからんけど >>99 どうもです。 文字は、Mac版では最終的には Core Text で描かれるのですけど、自分がやらなくてはならないのは IM から 受け取った NSAttributedString を直接描くのではなく、それをその言語のテキストオブジェクトに反映させる (それは既存の仕組みで結果的に描かれる)ということをしなくてはならないのです。 その NSAttributedString そのものを Cocoa フレームワークなり Core Text フレームワークなりに引き渡して描か せられれば、多分アンダーラインもいつも見ている形で勝手に表現されると予想してるんですが、それが出来ないのが 辛いところで。それでアトリビュートを解析する必要があるのです。 その言語のGUIにはアンダーラインを表示する仕組みがないので、そっちは自分でOpenGLで描かねばならんのですが... どこまで Cocoa なのかは、NSAttributedString から文字列と、そのアトリビュート情報を取り出すまで、ということ になります。 んー、よくわからんw IMで入力中の文節を知りたいの?描画を自分でするんでなくて。「アトリビュートを解析する必要がある」「アンダーラインを表示する仕組みがない〜自分でOpenGLで描かねば」てことは >>98 の >setMarkedText:selectedRange:〜 はそれで文節を得ようとしてもできなかったということか、単に。「切れ目のところでも同じアンダーラインが連続しているって描画」かなと思った であれば、あとちょっとだけじゃないのかな setMarkedText:string 〜 selectedRange: の、string の NSMarkedClauseSegmentAttributeName の値で文節を表しているっぽいけど。それででいいんじゃないかな。他のIM(Google)だとどうなんだろ、同じような気がしないでもない、いや、同じでじゃないと困るかな NSLog(@"%@", string); すると、 私の{ NSMarkedClauseSegment = 0; NSUnderline = 2; }名前は{ NSMarkedClauseSegment = 1; NSUnderline = 1; }中野です{ NSMarkedClauseSegment = 2; NSUnderline = 1; } のように、そのまんまのようだけど >切れ目のところでも同じアンダーラインが連続しているって描画」かなと思った 切れ目のところでも同じアンダーラインが連続している」って描画かなと思った >setMarkedText:string 〜 selectedRange: setMarkedText:string selectedRange:〜 >>101 >string の NSMarkedClauseSegmentAttributeName の値で文節を表しているっぽいけど。 素晴らしい情報、ありがとうございます! これで問い合わせれば行けそうな気がします。 アンダーラインのアトリビュートで表現されていると思っていたのと、他のアトリビュートを 見つけられなかったのが問題でした。帰ったら試してみます。 > IMで入力中の文節を知りたいの?描画を自分でするんでなくて。「アトリビュートを解析する > 必要がある」「アンダーラインを表示する仕組みがない〜自分でOpenGLで描かねば」てことは そうなんです。未確定文字列の文節を見つけたいということです。 この例で示していただいた「私の名前は中野です」の「名前は」と「中野です」が、両方共 NSUnderline = 1だからなのか、attribute:atIndex:effectiveRange: の指定アトリビュートをNSUnderlineStyleAttributeName にすると同じレンジで回答されてしまって切り出せなかった のです。 もう少し私も賢くなりたいので、NSLog(@"%@", string); をどこに書いてこれを調べられたのか 教えていただけませんか。それがわかっていれば、お手を煩わせることもなかったはず。 アトリビュートの内容自体も知らんでいいっぽいかな。文節毎の文字数がわかればいいだろう的では、 NSMutableArray *wardLengthList = [[NSMutableArray alloc] init]; const NSUInteger length = string.length; NSUInteger index = 0; while( index < length ){ NSRange range; [string attributesAtIndex:index effectiveRange:&range]; [wardLengthList addObject:@(range.length)]; index = range.location + range.length; } NSLog( @"%@", wardLengthList ); で、よさげ >>103 >NSLog(@"%@", string); をどこに書いてこれを調べられたのか setMarkedText:〜 の最初 >>105 >setMarkedText:〜 >の最初 NSTextInputClient を実装した View を作って、その setMarkedText:〜の最初に書いた ということですか? 既存の View を継承して、setMarkedText:〜だけオーバーライド すればいいのかな。いずれにしても、ありがとうございました。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる