- 締切済み
iPhone SDKに関して
iPhone SDKに関して 初めてこちらを利用させてもらいます。 よろしくお願いします。 画面上部でドラッグをしている間座標を取得して、 画面下部のTableViewに軌跡の座標を出力したいと考えているのですが、うまくいきません。 (ソースの一部です) [hファイル] IBOutlet UITableView *table; [mファイル] //座標取得 -(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { CGPoint locationPoint = [[touches anyObject] locationInView:self]; CGPoint previousLocationPoint = [[touches anyObject] previousLocationInView:self]; 最初はNSMutableArrayにlocationPointを格納して、 テーブルに反映できたらと思っていたのですが、型が一致しないのかエラーがでます。 ドラッグされたときに、リアルタイムで画面下部にあるテーブルに追加して表示したいのですが、こういうことは可能でしょうか? よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- harawo
- ベストアンサー率58% (3742/6450)
> [points addObject:("@%c",str)]; C言語の関数と、Objective-Cのメソッドを、ちゃんと区別できていますか? Objective-Cは、C言語をオブジェクト指向に拡張したもので、C言語のコードを、直接書き込むことができるという長所があり、同時にそれは、複雑でわかりにくいという欠点にもなっています。 「points」というのが、NSMutableArrayのインスタンスで、タッチ位置の座標をテキスト(NSString)に変換したものが、「str」だとしたら、「[points addObject: str]」になるはずです。 まず、C言語とObjective-Cを、はっきりと区別できるようになってください。 つぎに、メモリ管理を行えるようになってください。JAVAのように、最近の新しい言語は、Garbage Collectionを備えているものが多く、プログラマがメモリの解放をする必要がないのですが、iPhone/iPadのプログラムを開発するには、厳密なメモリ管理を、プログラマが行わなければなりません。256MB(iPhone 4は512MB)しかないメモリを、有効に利用するために、必要だからです。 タッチの軌跡を、テーブルに座標として表示し続けるプログラムとなると、あっというまにメモリを使い果たしてしまいそうですね。 NSMutable Arrayの、総量を決めておいて、古い項目は順次消去していくようなプログラムは、必須でしょう。 iPhone SDKにおける、メモリ管理の方法については、どの入門書を読んでも、かならず1章を割いているはずです。それほど重要な事項です。理解しにくいと読み飛ばすことなく、きっちりマスターしてください。
- harawo
- ベストアンサー率58% (3742/6450)
> 最初はNSMutableArrayにlocationPointを格納して、 > テーブルに反映できたらと思っていたのですが、型が一致しないのかエラーがでます。 NSArray(NSMutableArray)に格納できるのは、NSObjectのサブクラスだけです。変数、構造体などは格納できません。 NSValueというラッパクラスを使って、いったんCGPointをオブジェクトに変換するか、NSStringFromCGPointを使って、NSStringに変換するなど、ひと工夫が必要でしょう。 ほかにも、UITableViewが、挙動に追随してくれるのかどうかなど、心配な点はありますが、とりあえずこの点だけ指摘させていただきます。
お礼
ありがとうございます。 NSStringFromCGPointというものがあるんですね、こちらを利用して試してみたいと思います。 リアルタイムで厳しければ、一旦配列に格納しといて、 ボタンをタッチしたときに表示できるようにしてみたいと思います。
補足
NSString *point = NSStringFromCGPoint(locationPoint);// CGPointをString型に変換 このようにしてString型にできました。 初歩的な質問で申し訳ないですが、 現在[mファイル]には、 -(void)add:(NSString *)str{ [points addObject:("@%c",str)]; } -(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { CGPoint locationPoint = [[touches anyObject] locationInView:self]; CGPoint previousLocationPoint = [[touches anyObject] previousLocationInView:self]; NSString *point = NSStringFromCGPoint(locationPoint);// CGPointをString型に変換 add(point); NSLog(@"ポイント : %c\n", points); : } となっています。 NSMutableArray *points = [[NSMutableArray alloc] init]; という軌跡の座標を格納する配列を宣言したいのですが、どこに書けばいいのでしょうか? add();とtouchesMoved();内に書くと、呼び出されるたび初期化されてしまうと思うので、 関数の外に書いてみたのですが「Intializer element is not constant」とエラーが出てしまいます。 add(point);の部分には「Implicit declration of function'add'」というエラーも出ます。 お時間ありましたら、よろしくお願い致します。
お礼
回答ありがとうございます。 すみません、アカウントIDを忘れてしまい、返事をするのが遅くなってしまいました。 まだまだ勉強不足のようです、出直してきます。 軌跡の座標を配列に格納することはできました。 ありがとうございました。