[SDK]iPhoneアプリ開発初心者質問箱[touch] at MAC
[2ch|▼Menu]
1:名称未設定
09/05/22 11:39:17 AsAPLcDl0
iPhone, iPod touch用アプリケーションの開発を始めたばかりの初心者向け質問スレです。
[お願い]
1. 質問は日本語でもしくはObjective-Cで
2. どういう内容であれレスをもらったらお礼の言葉を忘れずに。
 回答者は自分の時間を使って親切で回答してくれています。
3. 回答者は自分も初心者であった事を忘れずに。
4. マルチポスト(複数のスレに同じ質問を書込むこと)は厳禁!
4. 質問は可能な限り具体的に。ただ「エラーが出ます」では
 エスパーかスタンド使いでなければ答えられません。エラー内容をちゃんと書きましょう。
5. わからない部分のコードをコピペすると手っ取り早いです。
6. このスレは無料プログラミング教室ではありません。
 「○○の仕方を教えてください」という質問はなるべく避けてください。
 「自分で調べたけどわからなかった事」を質問するというスタンスを忘れずに。

関連スレ等は>>2以降

2:名称未設定
09/05/22 11:42:22 8yZn9dHL0
はい!誰も使わないようなゴミアプリ量産して楽しいですか!?

3:名称未設定
09/05/22 11:45:33 AsAPLcDl0
>>2
楽しいですよ〜
金儲けだけが目的ではないです

関連スレ
本スレ
iPod touch/iPhone ネイティブアプリ製作 ver.11
スレリンク(mac板)

iTunes Connectの契約関係
iPhone Developer Program Pending Contract 2日目
スレリンク(mac板)

Xcodeの使い方メイン
Xcode part7
スレリンク(mac板)

Mac用開発がメイン
Cocoaはさっぱり!!! version.13
スレリンク(mac板)

Carbonはさっぱり!!!
スレリンク(mac板)

その他いろいろ
Macでプログラミング{9}
スレリンク(mac板)



4:名称未設定
09/05/22 11:50:26 oCAGvsww0
なんでム板やiPhone板に立てないの?

5:名称未設定
09/05/22 11:52:53 AsAPLcDl0
なにはともあれ公式のレファレンス
URLリンク(developer.apple.com)
日本語訳されたドキュメント
URLリンク(developer.apple.com)

関連図書(iPod touch/iPhone ネイティブアプリ製作 ver.11より)
【Cocoa全般、Objective-C】
 Mac OS X Cocoaプログラミング(ピアソンエデュケーション 、2002/06)アーロン・ヒレガス著、 村上雅章訳
 HappyMacintoshDevelopinTime 2nd Edition(ビー・エヌ・エヌ新社、2004/6)木下誠
 HappyMacintoshDevlopingTime 3rd Edition(ビー・エヌ・エヌ新社、2006/5)木下誠
 詳解 Objective-C 2.0(ソフトバンククリエイティブ 、2008/5)荻原 剛志
 たのしいCocoaプログラミング(ビー・エヌ・エヌ新社 、2008/8) 木下誠
 Xcodeプログラミング大全(アスキー・メディアワークス、2009/1/6) 柴田 文彦
【iPhone、和書】
 iPhone SDKプログラミング大全(アスキー・メディアワークス、2009/1)木下誠
 iPhone デベロッパーズ クックブック(ソフトバンククリエイティブ 、2009/2)エリカ・サドゥン著、(株)クイープ訳
 iPhoneSDKの教科書(秀和システム、2009/3)赤松正行
【iPhone、洋書】
 The iPhone Developer's Cookbook(Addison & Wesley、2008/10)Erica Sadun
 Beginning iPhone Development(APress、2008/11)Dave Mark
 iPhone SDK Application Development(O'Reilly、2009/1)Jonathan Zdziarski
 iPhone SDK Programming(Wiley、2009/3)Maher Ali



6:名称未設定
09/05/22 11:58:48 IXZ/p5lIi
>>1

関連スレ追加
Objective-C [ObjC part:4];
スレリンク(tech板)

7:名称未設定
09/05/22 11:59:29 Fdy4QDoQ0
>>1乙!!

8:名称未設定
09/05/22 12:07:08 IXZ/p5lIi
FAQ

Q: Windowsで開発出来る?
A: 出来ません。Macを買ってください。

Q: 一万円払わないといけないの?
A: シミュレータでの開発だけなら無料で出来ます。
実機への転送、App Storeでの配信にはiPhone Developer Program(年会費約一万円)への加入が必要です。

9:名称未設定
09/05/22 15:04:00 U9kmBH4Li
>>1乙っす

10:名称未設定
09/05/22 18:40:14 jougPNfW0
>>1にかいてある項目に番号がふってあるが
4が二つあるので

11:名称未設定
09/05/23 00:50:04 jdz0gYss0
儲かるアプリ作るのっていくらぐらい必要?
1万円で大もうけ出来る?

12:名称未設定
09/05/23 01:06:45 D/gQ+UVn0
おまえじゃ無理ってことははっきり言える

13:名称未設定
09/05/23 01:48:23 BnSLHDmJ0
>>4
iPhone板に立った開発スレがどういう経過を辿ったのか知ってるのか?
それはそれは酷かった

14:名称未設定
09/05/23 02:55:51 QI9QCWW70
ほとんどのアプリはたいして売れないって現実をつきつけられて期待しすぎた信者がファビョったスレだったな。

15:名称未設定
09/05/23 03:48:14 6euyOCqYi
例えば、NavigationController の RootViewContoroller から
MyAppDelegate のメソッドにアクセスするには、どうすればよいのでしょうか?

16:名称未設定
09/05/23 04:21:50 aCjfWkCk0
まずまな板を用意してだな

17:名称未設定
09/05/23 04:52:49 xyEEVO7oi
>>15
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

18:名称未設定
09/05/23 10:57:49 ZfErfsMX0
まだ一つも売り物出してないんだけどさ、
ITリテラシーの低い情弱どもがレビューで騒いでるのを見ると
一万払ってシコシココード書いたのを小銭レベルで売るのがアホらしくなりそうだわ。

ある意味「信者」がユーザーの大半な方が
ポリシーを共有できていいのかもしれん

19:名称未設定
09/05/23 11:09:42 oOLIIYLU0
みんなに使ってもらおうと無料で公開しても、
「無料なので文句は無いですが、私が欲しかったxxxの機能がないので,
星一個。」
とか書かれるからな。

20:名称未設定
09/05/23 11:23:09 rdu8Y63N0
そりゃxxxの機能つけないのが悪いわ

21:名称未設定
09/05/23 11:42:25 t2JTmqfqi
愚痴はここのスレでなくていいんでないかい?

22:名称未設定
09/05/23 12:31:02 tNCkvIFx0
「iPhoneアプリ開発者が愚痴るスレ」も必要なようだな

23:名称未設定
09/05/23 12:38:47 BnSLHDmJ0
ひとまずPending Contractに関して愚痴るのはこちらでどうぞ
iPhone Developer Program Pending Contract 2日目
スレリンク(mac板)


24:名称未設定
09/05/23 13:15:02 jdz0gYss0
大して儲からなくて、無料だと文句言われるのかwww
自分用に作って終わるのが一番良さそうだな。

25:名称未設定
09/05/23 14:57:22 jYx7SQ8f0
>>22
愚痴だけじゃあれなんで、雑談スレはどう?
値段の付け方とか、プロモーション方法とか。

26:名称未設定
09/05/23 15:07:37 lLKAxyeci
>>25
あまり乱立させてもあれなんで、ペンコンスレを雑談兼用になればいいんじゃない?
プログラミング以外の話はすべてそこに集約してはどうだろう

27:名称未設定
09/05/23 15:38:15 rIHlLX+W0
>>26
ねーよ
勝手に他スレに迷惑かけるな

28:名称未設定
09/05/23 16:00:57 NA36nwQR0
マ板でやれ。

29:名称未設定
09/05/23 16:18:23 i4k86/+5i
なんでネイティブアプリ開発スレでやらないの?
あそこはもとから雑談含んでるスレだと思ってたが。

30:名称未設定
09/05/23 16:21:12 BnSLHDmJ0
>>28
あそこは何となく向いてない気がする

31:名称未設定
09/05/23 17:26:00 Bcjq1COl0
>>29
低レベルな人が許せない人がいて雰囲気が悪いから
こういう初心者も温かく見てくれるスレがあると
初心者にとってはありがたい。


32:名称未設定
09/05/23 17:42:55 NA36nwQR0
上級者スレは上級者の上級者による愚痴スレだからな

33:名称未設定
09/05/23 18:08:52 OfIdOHcS0
初心者だけが集まらなかったら、それはそれでカオスな事になるだろうけどな。

34:名称未設定
09/05/23 18:13:19 OfIdOHcS0
>>33
×集まらなかったら
○集まったら

35:名称未設定
09/05/23 18:38:18 53XDl/WU0
いろいろ愚痴りたいよなあ。
このスレで愚痴りながら初心者の相手してやろうぜ。

36:名称未設定
09/05/23 19:18:07 OfIdOHcS0
iPhone開発スレの基本リアクション

儲かると聞いたので開発したいです→テメェじゃ儲からねえよ氏ねカス
絶対に売れる自信があるんです→だったら金払って開発依託しろ氏ねカス
本当はアプリを作ってみたいだけなんです→ウエルカム!

37:名称未設定
09/05/23 22:02:00 o9rJhs3c0
.NETのAPIとの対応表が無いのはなんでなのですか?
Javaは用意してあるのにAppleはなぜ用意しないの?

38:名称未設定
09/05/23 22:09:51 UGx/BYmC0
.NETって何?うまいの?

39:名称未設定
09/05/23 22:28:24 OfIdOHcS0
>>38
不味くて食えたもんじゃない

40:名称未設定
09/05/23 22:48:24 CeEdkYJ10
UITableViewについて質問です。
Cellの内容を瞬時に変更することはできるのでしょうか。



41:名称未設定
09/05/23 22:51:46 OfIdOHcS0
>>40
reloadData

42:名称未設定
09/05/23 23:45:10 OtvhZpY80
>>36
儲かると勘違いしてるやつへの忠告は親切心からのものだぜ。

>>37
中身がまるで違うのに対応表なんてムリ。

>>38
できると儲かるらしいよ。Objective-Cより需要は多いだろうし。
しかも、ごちゃごちゃしてるから保守案件でもたんまり稼げる。

43:名称未設定
09/05/24 00:03:18 HfsusODG0
>>37
Javaとの対応表ってマイクロソフトが準備してるんじゃないの?

44:15
09/05/24 01:36:22 FocE/Bbri
>>17
すいません。書き方が悪かったようです。
例えば、新規プロジェクトを Navigation-Based-Application(プロジェクト名「test」) で作成したとします。
testAppDelegate に - (void)hoge; を追加した場合に、rootViewController から hogeメソッドを実行するにはどうすればよいでしょうか?

45:名称未設定
09/05/24 02:03:01 UfJY+cJc0
testAppDelegate *appDelegate = (testAppDelegate *)[[UIApplication sharedApplication]delegate];
[appDelegate hoge];

こんなんでOKです
appDelegateは別の名前でもよい
右側は現在起動中のアプリの代表クラスを取得する命令
そのままだとid値が返るのでキャストしている
アップルのサンプル見る限りではこの方法がスタンダードっぽい
別の方法としてid値をそのまま利用するなら下のような方法もある

id appDelegate = [[UIApplication sharedApplication]delegate];
objc.msgSend(appDelegate,@selector(hoge));

46:名称未設定
09/05/24 02:04:50 UfJY+cJc0
最後の行間違えた

誤 objc.msgSend(appDelegate,@selector(hoge));
正 objc_msgSend(appDelegate,@selector(hoge));

47:15
09/05/24 02:29:37 FocE/Bbri
>>45
ありがとうございます。
最初に
[[[UIApplication sharedApplication] delegate] hoge];
これは試していたのですが、キャストしてやればよかったんですね。

これでもうまくいきました。
[(testAppDelegate *)[[UIApplication sharedApplication] delegate] hoge];

48:15
09/05/24 03:10:51 FocE/Bbri
逆に、UIApplicationDelegate のメソッドが呼ばれた時に、
rootViewController が表示されているか判断して、
表示されている場合は、rootViewController のメソッドを実行することも可能なのでしょうか?

49:名称未設定
09/05/24 04:32:08 ZqNdpccN0
UITableViewを継承したクラスのなかで、下記のようなコードで指定行を表示するようにしたかったのですが、
まったく機能しません。

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:12 inSection:0];
[self scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

書き方間違ってますでしょうか。

50:名称未設定
09/05/24 05:30:24 joiQF9IDi
>>48
if (rootViewController.view.superView) {
[rootViewController hoge];
}

51:名称未設定
09/05/24 06:34:29 R4CNlZi90
>>48
速度を気にしない処理ならNSNotificationでも良いと思う。

52:名称未設定
09/05/24 13:17:27 qS58jhxG0
>>47
そのメソッドだったら、別にキャストしなくても

[[[UIApplication sharedApplication] delegate] hoge];
で全く問題なく動くはず

53:名称未設定
09/05/24 15:35:39 CnUiPHWR0
警告が出るんじゃね?

54:名称未設定
09/05/24 15:45:17 rtcNDZ1a0
>>52
キャストを知ってる初心者も珍しいが、
一応初心者スレなんだし、メッセージングとか理解してないと危ないような
アドバイスはやめとこうぜ。

55:名称未設定
09/05/24 15:50:18 KXMS/pef0
>>52
動くには違いないけど、“全く問題なく”というのは言い過ぎ。

56:名称未設定
09/05/24 16:59:26 CnUiPHWR0
便乗すまん
キャストが正しいかどうかってどうやって判断すりゃええのん?
動的に型をチェックする方法がわからん

57:52
09/05/24 17:15:20 qS58jhxG0
確かに警告は出るが。。 >>47 は警告がでるけど動く事は、当初から認識してたのか

>>56
if( [object isKindOfClass:[Hoge class]]] )

または isMemberOfClass:

またクラス名の文字列を取得するのは, MacOS X だったら className だったんだけど、
iPhone だとこのメソッドが無いみたいで [[object class] description] で取得できる


58:名称未設定
09/05/24 17:36:55 2LnMxi26i
>>57
NSString * NSStringFromClass(Class class);
だよっ!

59:名称未設定
09/05/24 17:44:50 3K8kbShj0
>>57
つNSStringFromClass([Hoge class]);

60:名称未設定
09/05/24 17:45:54 3K8kbShj0
>>58
ごめ。かぶった

61:名称未設定
09/05/24 17:45:55 CnUiPHWR0
>>57-58
ありがとう!

62:名称未設定
09/05/24 19:00:23 t1CYAEmk0
皆さん、開発マシンは、何使ってます?
白ポカリでも、十分?
まだマックは未保持。

63:名称未設定
09/05/24 19:08:47 Xrvo4hQM0
全然OK。

64:名称未設定
09/05/24 20:36:52 c0Q42Y+d0
ポカリじゃ開発は難しいでしょ

65:名称未設定
09/05/24 20:51:57 P0A7Ebu20
>>62
> 白ポカリ
白ポカリや青ポカリじゃ無理。

66:名称未設定
09/05/24 21:00:29 KXMS/pef0
どんな餌でも釣れるスレだな

67:名称未設定
09/05/24 21:08:15 c2tZcjh50
こんちには みさなん おんげき ですか? わしたは げんき です。
この ぶんょしう は いりぎす の ケブンッリジ だがいく の けゅきんう の けっか
にんんげ は もじ を にしんき する とき その さしいょ と さいご の もさじえ あいてっれば
じばんゅん は めくちちゃゃ でも ちんゃと よめる という けゅきんう に もづいとて
わざと もじの じんばゅん を いかれえて あまりす。
どでうす? ちんゃと よゃちめう でしょ?

68:名称未設定
09/05/24 21:40:04 y67e8R6Ii
>>64,>>65
ツッコミたいのをグッと堪えたのに

69:名称未設定
09/05/24 22:17:57 t1CYAEmk0
>>62
自己レスです。
ポカリでは、無理ですね。
ポリカですね。
でも、ポリカでは、つらいですか。

70:名称未設定
09/05/24 22:37:00 qS58jhxG0
>>57-58 こんな関数があったとは(><)

>>69
ポリカ使ってるけど,全然つらくないよ。前が PowerBook だったから、すごい快適。
いろんなアプリをたくさん立ち上げてると,メモリ(2G)が足りない感じがあるし、
画面は大きいのが欲しいと思うときもあるけど。

71:名称未設定
09/05/24 22:52:36 KXMS/pef0
>>70
要するにポリカじゃつらいって事だろ?

72:名称未設定
09/05/24 23:04:01 RJimGWo90
ポリカって何?初心者スレなんだから初心者にも判るように正式名称で書け!

73:名称未設定
09/05/24 23:21:25 qIas7pVF0
>>69
現行のMacBook Whiteなら同じクロックのアルミと近い性能があるから問題なし。
NVIDIA GeForce 9400Mも載ってるし。

74:名称未設定
09/05/24 23:39:29 UfJY+cJc0
>>72
MacBook White
筐体がポリカーボネート製なので略に使用したものと思われる
一応今後も質問ありそうなので以下勝手にまとめる

iPhone向けアプリ開発はCPUにintel製積んでるMacならどれでもできる
デスクトップならMac mini、ノートならMacBookの一番安いのでも可能
明確な「これが出来ないから困ることになる」ってことはない
もちろんより快適にとか言い出せばきりはないので、その辺は導入にかけられる予算次第

75:名称未設定
09/05/25 00:11:35 zkLPR6RJ0
MacBook竹を開発用に買ったんだけど、
Xcodeと外部エディタとIBとシミュレーターと
Finderが開いてるとSafariのドキュメント
見ながら開発できねえや。

マルチディスプレイって、ケーブル買ってくれば
OKなんだよね?

76:名称未設定
09/05/25 00:35:31 OjQ9cD6u0
ディスプレイも買えよ

77:48
09/05/25 02:14:11 DqYlnZNsi
>>50
度々すいません。
その場合、rootViewController はどのように取得すればいいのでしょうか?
rootViewController *viewController = [[rootViewController alloc] ...
とかだと別物になってしまいますよね?

78:名称未設定
09/05/25 07:18:32 zxIVntNwi
>>77
App Delegateがインスタンス変数として保持し、そのメソッドのなかで>>50
または、>>51で言われているようにノーティフィケーションを使い、View Controller側の処理はView Controllerに自分でやらせる。
かな。

79:名称未設定
09/05/25 07:25:27 rAO2jp990
テンプレートの Navigation Controller を使ったアプリだったら,

testAppDelegate のヘッダに、rootViewController を参照する変数を作り、 Interface builder
で rootViewController と接続する。
(testAppDelegate がnavigationController とつながっているのと同じようにrootViewControllerをつなげる)


また別のやり方では, 
[navigationController topViewController] が rootViewController であるかどうか判定する。
判定のやり方は>>57

80:名称未設定
09/05/25 15:31:11 KHXiKz4i0
>>78,79
ありがとうございます。

以下の方法で、やりたいことが実現できました。

if ([NSStringFromClass([[navigationController topViewController] class]) isEqualToString:@"RootViewController"])
{
[[(RootViewController *)[navigationController topViewController] titleLabel] setText:string];
}

81:名称未設定
09/05/25 17:42:23 6p17fcAq0
動的にnavigationItemを追加したり、
削除したりって変更したりってどうやったらできるんだろうか?

pushとかpopしてnavigationItemが変わってるっていうならわかるんだけど、
例えば、UIViewにボタンが設置してあって、
そのボタンを押したらnavigationItemが変わるみたいな。

82:名称未設定
09/05/25 18:03:46 ywUYztJz0
>>81
UINavigationItemクラスのプロパティで変更できるよ。

UIBarButtonItem *button = [[UIBarButtonItem alloc] 〜]
self.navigationItem.rightBarButtonItem = button;
[button release];

とか。


83:名称未設定
09/05/25 19:09:39 6p17fcAq0
>>82
例えば、UIViewにボタンを設置して、
そのIBActionにUIBarButtonItemを追加するようなメソッドを指定しても、
ボタンを押しただけぢゃ追加されないと思うよ。

教えてくれた方法だと、例えばpopとかpushとかしてViewを再描画しないと追加されないでしょ?
それを、動的にボタンを押しただけで描画されるにはどうしたらいいのかな?ってわけさ。

84:名称未設定
09/05/25 19:56:24 EKln9c8Z0
>>83
ボタン押され時に再描画もすりゃいいじゃん。setNeedsDisplayとか使ってもいいし。

85:名称未設定
09/05/25 20:54:21 IA5t1qp90
こっちのスレの方が元スレより正常運転してるのが滑稽だ…

86:名称未設定
09/05/25 22:24:51 JwgyP9yHi
本スレは雑談だけに使えばいいさ
あっちにコード書いても“基本おじさん”に一括されて終わりだし

87:名称未設定
09/05/25 22:27:28 8gjwm5L3i
基本おじさんw

88:名称未設定
09/05/25 23:18:10 fyqEhjML0
You can't do it !

89:名称未設定
09/05/26 05:43:28 S6udQu0+0
禿携帯買って、禿げマク買うなんて釣られ過ぎ。
大して儲からないのに、どんだけ金使うの。

90:名称未設定
09/05/26 06:37:29 TTeGRdfg0
ViewControllerを二個つかったアプリを作っているんですが、画面回転に追従してこないのは何が原因なんでしょう?

AppDelegate内にAViewController,BViewControllerをIBで作成して各コントローラ単独では回転できるんですが、AViewControllerからAppDelegate経由でBViewControllerを呼び出すとAViewControllerは横画面なのにBViewControllerは縦画面になっちゃうんですが。
viewWillAppearで縦横を判断して回転させるみたいな処理が必要なんでしょうか?


91:名称未設定
09/05/26 08:48:37 NTffK6lV0
>>89
それが現実歪曲空間ですよ

92:名称未設定
09/05/26 10:43:36 oF6CeKYh0
>>89
こんなに楽しい遊びはないだろ。Frameworkきれいだし。

93:名称未設定
09/05/26 10:44:33 oF6CeKYh0
>>90
表示されてないときは、向きが管理されてない。

94:名称未設定
09/05/26 11:35:09 Wz5MtZnn0
表面だけ眺めてても見えないような、新たな使い方を発見する度にしびれるな


95:名称未設定
09/05/26 11:59:48 iwboRq210
>>90
どういうタイミングで、ってのは気にした事も無かったんだけど、
とりあえず
shouldAutorotateToInterfaceOrientation:
がちゃんと実装されていれば自動的に回転してるなあ
参考にならなくてスマン

>>89
海外旅行、ダイビング、登山、ドライブetc
大概の趣味はもっと金かかるぞ

96:90
09/05/26 13:04:18 FJN1T14X0
shouldAutorotateToInterfaceOrientationはYESを返す様にしているからBViewControllerの画面を表示させてから回転させるときちんと回転するんですよ。
AViewControllerで横画面にした状態からBViewControllerを呼び出すと縦に戻される原因が何かわからないんです。

>>93
viewDidAppearでも良いんですが自前で回転させるしかないの?

97:名称未設定
09/05/26 13:13:30 y1bOQPGSi
>>96
AとBをさらに一つのView Controllerに入れて管理すればできそう。
試してなくてゴメンだけど。

98:名称未設定
09/05/26 13:15:26 Y2jToh1H0
>>90
>ViewControllerを二個つかったアプリを作っているんですが、画面回転に追従してこないのは何が原因なんでしょう?

ContainerView的なものに入れ子にしてContainerViewControllerに回転の処理を書けば?
僕も試してそうなったから、結局入れ子にした。


99:90
09/05/26 13:35:19 FJN1T14X0
>>97-98
ひんとをアザース!www

100:名称未設定
09/05/26 13:39:03 VP1JtW+60
iPhoneのホーム画面UIを自作しようと思うんですけど、
アイコンをソートしたとき、グリッドに沿って移動するような動きをしますよね?
そこでつまずいていまして。。。
みなさん、作るとしたらどんなView構成で、どんなメソッド使いますか?

ちなみに、僕は今、UIViewにscrollViewとpageControllerが乗っていて、
scrollViewにUIView(これがアイコン)を乗せています。
各々のスクロール、タッチ、ドラッグはUIViewのtouch系メソッドで検出しています。


101:名称未設定
09/05/26 13:48:07 VP1JtW+60
>>100です。
自己解決したっぽいです!
お騒がせしました。

102:名称未設定
09/05/26 13:48:55 Uk9k4a9w0
自分だったら、
>各々のスクロール、タッチ、ドラッグはUIViewのtouch系メソッドで検出しています。

はやらない。アイコンの view はタッチに無反応となるようにして、
scrollView (または別のオブジェクト)が各アイコンのタッチ、移動などを管理するようにする。
他のアイコンの移動アニメーションなんかが楽になると思うから。

103:名称未設定
09/05/26 14:04:32 VP1JtW+60
>>102
とても参考になりそうです。
scrollViewのスクロールは、おおもとのUIViewControllerにデリゲートメソッドを書いています。
そのUIViewControllerから、アイコンのtouchを検出するにはどうしたらいいんでしょう?

アイコンは、アイコン用のUIViewクラスを複数呼び出してscrollViewにaddSubViewしてます。

104:名称未設定
09/05/26 14:14:16 Uk9k4a9w0
scrollView のサブクラスの touchesBegan... でviewController を呼ぶとか。

アイコンの位置は決まった場所なんだから計算して分かるし、pointInside:withEvent: で
判定してもいいし。

105:名称未設定
09/05/26 14:52:18 VP1JtW+60
>>104
僕は頭が足りないので理解度50%ですけど、
scrollViewのscrollViewDidScroll...と、touchesBegan...って共存できないと思うんですよね。

アイコンたちに、viewControllerのプロパティを設定しておいて、
そこからviewControllerにアクセスして。。。という方法に変更しようかと思います。
ドラッグ中の当たり判定は、透明のviewをscrollViewの上にグリッドに沿って設置して、
viewControllerから見るようにしようかと思います。

106:名称未設定
09/05/26 15:04:28 Uk9k4a9w0
>>105
MyScrollView に touchesBegan...を実装して,そこで

[ self.delegate scrollViewDidAcceptTouch: ...];
[super toucehsBegan...];

のように、タッチイベントがあった事を delegate か viewController に教えてやる。

あと、UIScrollView は意味不明な挙動をする事が多いから,サブビューのアイコンがタッチイベントを
受け付けるようにすると,後々大変かも?ってのもある。
(例えば,ページ切り替えジェスチャとアイコンタッチのジェスチャとが共存しにくいとか。)

107:名称未設定
09/05/26 15:14:29 VP1JtW+60
>>106
なるほど!理解しました!

>例えば,ページ切り替えジェスチャとアイコンタッチのジェスチャとが共存しにくいとか。

まさに、昨日苦戦して分岐分けしたところだ!
現状、ドラッグ開始したらscrollViewがスクロール禁止するようにしてるんだけど、
そのドラッグ開始のタイミングが微妙。
急ぎすぎると、スクロールしちゃうとかってバグがあったから、
こっちのほうが断然いけそうな気がする。

108:名称未設定
09/05/26 15:56:01 VP1JtW+60
>>106
やってみました。
一応、scrollViewからtouchを検出しました。
そこで、1つ疑問が。。。scrollViewに乗ってるアイコンたち、
どれがタッチされたかとかって、座標で見るしかないのかな?

109:名称未設定
09/05/26 16:52:57 jIp8m6d70
以下のコードでは、okMethodは実行できますが、ngMethodは実行時にエラーになります。

@interface MyObject:NSObject{
NSMutableString *myValue;
}
@property (retain) NSMutableString *myValue;
@end

@implementation MABValueModel
@synthesize myValue;

-(void)okMethod{
NSMutableString *_inputValue = [[NSMutableString alloc]initWithString:[self myValue]];
[_inputValue deleteCharactersInRange:NSMakeRange(0,[[self myValue] length]-1)];
[self setMyValue:[NSString stringWithFormat:@"%@",_inputValue]];
[_inputValue release]
}
-(void)ngMethod{
[[self myValue] deleteCharactersInRange:NSMakeRange(0,[[self myValue] length]-1)];
}

違いは、NSMutableString のクラスメソッドdeleteCharactersInRange:を、
propertyであるNSMutableString *myValueに実行させるか
一時変数のNSMutableString *_inputValueに代入してから実行させるかだけの
違いだと思うのですが、なぜ一方は実行できて、もう一方はエラーになるのでしょうか。
効率で考えると、一時変数の確保も解放もしないngMethodの方が良いと思っているのですが。
どなたか、このふたつの違いをお教えください。
cocoaスレで聞くべきかもしれませんが、宜しくお願いします。

110:109
09/05/26 16:55:07 jIp8m6d70
@implementation の行を間違えましたので書き換えました。
すみません。

以下のコードでは、okMethodは実行できますが、ngMethodは実行時にエラーになります。

@interface MyObject:NSObject{
NSMutableString *myValue;
}
@property (retain) NSMutableString *myValue;
@end

@implementation MyObject
@synthesize myValue;

-(void)okMethod{
NSMutableString *_inputValue = [[NSMutableString alloc]initWithString:[self myValue]];
[_inputValue deleteCharactersInRange:NSMakeRange(0,[[self myValue] length]-1)];
[self setMyValue:[NSString stringWithFormat:@"%@",_inputValue]];
[_inputValue release]
}
-(void)ngMethod{
[[self myValue] deleteCharactersInRange:NSMakeRange(0,[[self myValue] length]-1)];
}

違いは、NSMutableString のクラスメソッドdeleteCharactersInRange:を、
propertyであるNSMutableString *myValueに実行させるか
一時変数のNSMutableString *_inputValueに代入してから実行させるかだけの
違いだと思うのですが、なぜ一方は実行できて、もう一方はエラーになるのでしょうか。
効率で考えると、一時変数の確保も解放もしないngMethodの方が良いと思っているのですが。
どなたか、このふたつの違いをお教えください。
宜しくお願いします。

111:名称未設定
09/05/26 17:17:18 Uk9k4a9w0
>>1
>4. 質問は可能な限り具体的に。ただ「エラーが出ます」では
> エスパーかスタンド使いでなければ答えられません。エラー内容をちゃんと書きましょう。


112:名称未設定
09/05/26 17:22:35 VP1JtW+60
>>110
エラーとは関係ないけど、とりあえず、代入は必要ですよね?

-(void)ngMethod{
myValue = [[self myValue] deleteCharactersInRange:NSMakeRange(0,[[self myValue] length]-1)];
}

113:名称未設定
09/05/26 17:44:54 7HZTBIqY0
>>112
必要ない。っていうか、void だし…適当やなぁ…

>>109
myValue が nil と見た。あと、インスタンス変数にアクセスするのに、いちいち
[self myValue] なんてしなくていいよ。

- (void) ngMethod {
 if (!myValue || [myValue length] == 0)
  myValue = [[NSMutableString alloc] initWithString:@"empty"];
 else
  [myValue deleteCharactersInRange:NSMakeRange(0, [myValue length]-1)];
}

114:110
09/05/26 17:45:44 jIp8m6d70
>>111
すみません。
このメソッドが実行されると、デバッガコンソールに
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with deleteCharactersInRange:'
と表示されます。
[self myValue]
は、NSMutableStringです。

>>112
そうなんですか
[_inputValue deleteCharactersInRange:~~~]
では、_inputValueの中身の文字列が変更されたので、
[[self myValue] deleteCharactersInRange:~~~]
とすると、[self myValue] の中の文字列が変更されるのかと思っていました。

115:名称未設定
09/05/26 17:48:42 Y5CyaPOR0
>>110
myValueを生成してないんじゃね?

116:名称未設定
09/05/26 17:48:54 kJ5iINYMi
>>114
- (void)setMyValue:(NSMutableString *)newValue {
if (myValue != newValue) {
[myValue release];
myValue = [newValue mutableCopy];
}
}

普通プロパティはNSStringにする気がする。

>>112
おい。

117:名称未設定
09/05/26 17:55:27 iwboRq210
生成の時点で正しくmutableとして生成されてないのでは?
あるいはどこか他のところで意図せずNSStringが代入されているとか
ngMethodに
NSLog( [[myValue class] description] );
を入れてみ?

118:名称未設定
09/05/26 18:03:26 Uk9k4a9w0
>>110
>[self setMyValue:[NSString stringWithFormat:@"%@",_inputValue]];

ここでも型が間違っているように,どこかで myValue に NSMutableString ではなくて
NSString をいれて仕舞っているんだと思う。


119:110
09/05/26 18:03:55 jIp8m6d70
>>117
NSLog( [[myValue class] description] );
を入れてみたところ、
NSCFString
と表示されていました。
「意図せずNSStringが代入されている」なのかもしれません。
一度、コード全体を確認してみます。
ありがとうございました。

>>113
> あと、インスタンス変数にアクセスするのに、いちいち
> [self myValue] なんてしなくていいよ。
ホントだ!ありがとうございます。

>>みなさん
ありがとうございました。
ちょっとテストコードで検討してみます。

120:名称未設定
09/05/26 18:08:03 7HZTBIqY0
>>117, 109
クラスクラスタで、NSString, NSMutableString -classは、両方 NSCFString
を返すので、確認できん。respondToSelector: も区別できん(両方 YES)。
なので、プログラマが気をつけるしかないかな?
@try {} @catch{} で、NSInvalidArgumentException を検出するくらいだが、
推奨されてないしね。

121:名称未設定
09/05/26 18:11:07 VP1JtW+60
>>113
>>116

okMethodでsetMyValueしてたからさ。
エラーとは関係ないけど。

122:名称未設定
09/05/26 18:13:30 VP1JtW+60
↑あ、deleteか

123:名称未設定
09/05/26 18:16:15 7HZTBIqY0
訂正 > 113
nil にメッセージ送っても問題ない事を忘れていた…orz

>>121
おぉ、ご明察。先にokMethod呼んでる可能性もあるね。

124:名称未設定
09/05/26 18:20:42 TZq+2pwV0
myValueにどうやって値を設定しているのか分からんが、これだとngMethodでこける。
myObject.myValue = @"hogehogefoofoobar";

こっちはいける。
myObject.myValue = [NSMutableString stringWithString:@"hogehogefoofoobar"];


そりゃそうやんなぁ。

125:名称未設定
09/05/26 18:40:04 iwboRq210
>>120
おおほんとだ
mutableでもNSCFStringが返るね
[object isKindOfClass:[NSMutableString class]]
でも判別できない(immutableなstringでもYESが返る)
ということで>>117は忘れて
まあそこでmutableなstringではないのはたしかっぽいけど

>>116みたいにセッタをかくのが確実だろうね

126:110
09/05/26 18:45:43 jIp8m6d70
いろいろありがとうございます。

ngMethodも動くようになりました。

>>123
myValueを設定している箇所が言われたとおりでしたので、
self.myValue = [NSMutableString stringWithString:@"hoge"];
としました。
ありがとうございました。

>>116
Mutableな時は、setMyValueはダメなんですね。
[self setMyValue :@"hoge"];
[myValue setString:@"hoge"];
self.myValue = [NSMutableString stringWithString:@"hoge"];
この三つの違いが分からなくなっていました。
文字を変更するだけの時はsetString:でokですよね?

127:名称未設定
09/05/26 19:01:21 Uk9k4a9w0
>>126
上から
- myValue 自体が @"hoge" (NSString) に置き換わる(型が変わってしまう)
- myValue のNSMutableStringインスタンス自体はそのままで、示す文字列が @"hoge" に置き換わる
     (あらかじめmyValue がNSMutableString でなければならない)
- myValue 自体が新たな NSMutableString に置き換わる。

128:110
09/05/26 19:19:54 jIp8m6d70
>>127
とてもわかりやすかったです!
ありがとうございました

129:116
09/05/26 20:57:45 kJ5iINYMi
>>126
>self.myValue = [NSMutableString stringWithString:@"hoge"];
>としました。

それはかなり良くない解決法ですよ。

どうしてもngMethodを使いたくて、"とりあえず"動かすなら>>116のほうがいい。
でも一番いいのは多分↓

@interface MyObject:NSObject{
NSString *myValue;
}
@property (copy) NSString *myValue;
@end

@implementation MyObject
@synthesize myValue;

- (void)okMethod {
NSMutableString *newValue = [NSMutableString stringWithString:self.myValue];
[newValue deleteCharactersInRange:NSMakeRange(0, [newValue length] - 1)];
self.myValue = newValue;
}

@end

130:110
09/05/26 22:03:53 jIp8m6d70
>>126
アドバイスありがとうございます。
後学のため、何故に「良くない解決法」なのか
詳しく教えていただけないでしょうか。

ご呈示いただいたメソッドは、仮の変数を使うと言う形ですね。
このメソッドの最後で、newValueはリリースする必要はありますか?

また、この場合、
@property (copy) NSString *myValue;
とした方が
@property (retain) NSString *myValue;
よりも良いのはなぜなのでしょうか?
self.myValue = newValue;
の時に、newValueのインスタンスそのものではなく、
newValueの中身(の文字列)がコピーされると言う認識で
あっていますか?

すみません、基本が分かっていない質問で申し訳ないです。

131:90
09/05/26 23:04:54 Q/SHF4PC0
二個のViewControllerを一つのViewControllerの子にしようとIBを立ち上げたのですがViewControllerの中にViewControllerを入れ子にできないのよね(´・ω・`)
まとめるっていうのはひとつのVIewControllerに複数のUIViewを入れるって事なのかしら?


132:名称未設定
09/05/26 23:43:28 Wz5MtZnn0
>130
そのプロパティにはNSStringの他にそのサブクラスのNSMutableStringなんかも警告無しに代入出来ちゃう。
NSMutableStringだと代入されたあとに中身が変わる可能性があり、
copyなら代入時の内容が次の代入までそのままであることが変なことしない限り保証されるけど、
retainだと保証されない。
副作用さえわかってれば、あとは好き好きだとおもうけど。

変なタイミングで中身変えられて困るようなものつくってるときに、
一緒に開発する相手が信用できない場合はcopyを選ぶかも。


133:名称未設定
09/05/27 07:20:49 cHsJy+E80
>131
ViewだけIBで書いて、あとはコードで書いたほうが手っ取り早い。

134:126
09/05/27 09:28:16 4oe84EHTi
まず、設定する側にNSMutableStringを強要するというのがバグの温床となる。
設定される側が、自分の責任で、NSStringが来ようがNSMutableStringが来ようが適切に処理するようにしておけば、
設定する側は何も気にせず値を入れられるようになり、プログラミングが楽で、バグが出る可能性も低くなるというのは分かってもらえると思います。
そういう意味で、ngMethodを'とりあえず'動かすならその場しのぎの>>126でなく、後々のためにも>>116の方がいいということです。

でも実は>>110のngMethodを動かそうとすること自体が問題です。
今回のngMethodでは
[[self myValue] deleteCharactersInRange:range];
としてしまっていますが、これはゲッタを介して得たインスタンス変数に、セッタを介さずに直接変更を加えてしまっています。
ngMethodは自分のオブジェクトの中でのことなので問題が表面化しませんが、
ngMethodが動くということは、外部からも同じく、セッタを介さずにインスタンス変数を直接変更出来るようになっているということです。

これでは、情報を隠蔽化するというプロパティ、アクセッサの役割を全く無駄にしています。
アクセッサの役割を活かすには、インスタンス変数への変更は
1),内部からインスタンス変数を直接変更する
2),内部からセッタを介して設定する
3),外部からセッタを介して設定する
に限定しておいた方がいい。

135:129
09/05/27 09:29:21 4oe84EHTi
>>134の続き

そこでmyValueをNSStringに変えてしまって、2の方法で目的を実現したのが>>129です。
別の方法として、myValueをNSMutableStringのままで、内部からは1の方法で目的を実現し、
かつ外部からは直接変更出来ないように(実は出来るけど、警告は出る)したのが以下です。

@interface MyObject:NSObject{
NSMutableString *myValue;
}
@property (copy) NSString *myValue;
@end

@implementation MyObject
@synthesize myValue;

- (void)setMyValue:(NSString *)newValue {
if (myValue != newValue) {
[myValue release];
myValue = [newValue mutableCopy];
}
}

- (void)okMethod {
[myValue deleteCharactersInRange:NSMakeRange(0, [myValue length] - 1)];
}

@end

ちょっと神経質すぎるかもしれませんが。

136:130
09/05/27 09:29:52 53+HxMiOi
>>132
ありがとうございます。
なるほど。違い理解できました。
保守性考えた時に良いんですね。

137:134=135=129
09/05/27 09:32:34 4oe84EHTi
ミスった。
>>134=>>129で、>>126へのレスです。
長文連投すいません。

138:110=126
09/05/27 09:43:08 53+HxMiOi
>>134-135
わかりやすい説明ありがとうございます。
良くない理由、理解できました。
コードの詳細は、これから頑張って理解します(笑)
良い流儀、潜在的危険な書き方などは、なかなか難しいですね。勉強します。

139:90
09/05/27 09:50:56 q4FN99i/0
>>133
そげな一言で片付けられるなら初心者スレに来ないですたい(´・ω・`)
1:IBでViewControllerをつくる。
2:新規ソース作成でViewControllerサブクラスを作成。ParentViewControllerとか名付ける。
3:ParentViewController.hのメンバに前述のAViewControllerとBViewControllerを含める。
こんな感じですか?

140:名称未設定
09/05/27 11:02:07 te2IdrEg0
>>139
iPhone用プロジェクトのUtilityアプリだっけ、Main ViewとFlip side Viewを切り替えるやつ、
あんな感じでWindow上にはRootViewControllerを乗っけておいて、
別に準備しておいたViewControllerを二つあとからコードで乗っければ良いんじゃないの?
乗っけ方はRootViewControllerのtoggleView:を参考にして

141:90
09/05/27 11:46:28 q4FN99i/0
なるほど。Utilityテンプレートを参考にするのですね。
あざーすwwww

142:名称未設定
09/05/27 11:55:49 2Y2lfcdv0
大事な言葉はふざけながら言わないほうがいい。

143:名称未設定
09/05/27 11:59:11 0yz1IPK80
>>142
人生に関しても初心者なんだよ

144:名称未設定
09/05/27 12:14:08 mqiaW5Jm0
まあ、答えてくれた人がリアルで知人・友人ってこともないだろうし、
お礼は一般的な表現にしたほうが良さそうだね
質問する側も答える側も気持ちよく使えるスレになったほうが結果として自分のためになるからね

145:名称未設定
09/05/27 13:28:26 0yz1IPK80
>>144
身近に詳しい人がいたら2chで聞かねーよw

146:90
09/05/27 13:38:29 q4FN99i/0
ありがdは良くてあざーすwwwはダメなの?(´・ω・`)

147:名称未設定
09/05/27 13:47:13 CnwAWwcoi
2chではこれくらい砕けた例の方がうれしいけどな。俺は。

148:名称未設定
09/05/27 13:47:53 CnwAWwcoi
×例
○礼

149:名称未設定
09/05/27 13:59:51 g/++ORAl0
>>146
それは常識で分かれよ

150:名称未設定
09/05/27 14:01:56 cHsJy+E80
>>146
>あざーすwwwはダメなの?

www付ける意味がわからん。
笑われてるみたいだ。

151:名称未設定
09/05/27 14:13:57 eTmr/DIti
Mac系プログラミングスレはお年寄りが多いから、言葉遣いには気をつけた方がいいぞ

152:名称未設定
09/05/27 14:17:53 fXcy/FvG0
ありがdやサンクスコはあってもあざーすwwwはないな。

153:名称未設定
09/05/27 14:25:45 0yz1IPK80
NGワード
・あざーすwww
・教えてエロい人

154:90
09/05/27 14:51:14 q4FN99i/0
>>151
サーセンwww


155:名称未設定
09/05/27 14:53:32 mORqVUJu0
ワロスw

156:名称未設定
09/05/27 15:18:09 oyCOwV010
>>154
>>151は煽りじゃなくて忠告だろ。お前最低だな。

157:名称未設定
09/05/27 16:47:26 rQRiXzwK0
あれで、真剣に謝ってるんだよ。そいういうのリアルに多いから。


158:名称未設定
09/05/27 19:38:57 xXgfT+F10
>>139

[rootViewController.view addSubView:subAViewController.view];
[rootViewController.view addSubView:subBViewController.view];

ControllerじゃなくてViewを入れ子にするんじゃないの?


159:名称未設定
09/05/27 19:41:41 te2IdrEg0
2chだから良いけどユーザーからのバグレポートにサーセンwwwとか返さないでくれよ?

160:名称未設定
09/05/27 20:06:01 3QkPjo0K0
質問させてください。
UIButtonを生成してaddSubViewするんですけど、
そのUIButtonをドラッグさせたいんです。

[button addTarget: self action: @selector(move:) forControlEvents: UIControlEventTouchDragInside];

このように、UIControlを追加して、
moveメソッドで座標を計算してUIButton自体を移動させたいんですけど、
どのようにしたらいいのでしょうか?

161:名称未設定
09/05/27 20:07:36 3QkPjo0K0
>>160の続きです。

Viewを移動するときは、- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) eventで、
CGPoint pt = [[touches anyObject] locationInView: self];
CGRect frame = [self frame];
frame.origin.x += (pt.x - self.startLocation.x);
frame.origin.y += (pt.y - self.startLocation.y);
self.frame = frame;
というふうに、移動するのはわかるのですが、
moveメソッドで、touchesを取得することができないんです。
試しに、UIButton生成時に、@selector(move:touches:)として、
touchesを出力してみると、
<UITouchesEvent: 0xd3ac90> timestamp: 33374.9 touches: {(
<UITouch: 0xd2b320>
phase: Began
tap count: 1
window: <UIWindow: 0xd18880; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0xd196e0>>
view: <UIRoundedRectButton: 0xd2ba90; frame = (0 0; 50 50); opaque = NO; layer = <CALayer: 0xd2a3c0>>
location in window: {32, 58}
previous location in window: {32, 58}
location in view: {27, 33}
previous location in view: {27, 33}
)}

というような出力がでます。

<UITouchesEvent: 0xd3ac90>の中の<UITouch: 0xd2b320>が取れればいいのかと思ったのですが。。。
どうしたらよいでしょうか?

162:名称未設定
09/05/27 20:25:13 22k+iuM/0
まだリファレンスを通し読みしてるとこだけど、
タッチってタッチイベントがトリガーになってるから
スタート時に触れてる指は検出できないのかな?

163:名称未設定
09/05/27 20:43:16 VazsfHjr0
初心者だと既成のクラスだけを使うことに気が取られちゃうけど、
サブクラスをガンガン作るのが基本だし、楽。

ボタンを UIButton のサブクラスにして、そのクラスの
- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event

で自分自身を移動させた方が速いような。[button addTarget:... なんてわざわざいらないし。


164:名称未設定
09/05/27 20:56:10 s15SM/9n0
教えて下さい。
オーガナイザに実機が登録できません
DEVICESの自分の実機名の横にある丸いやつは黄色になってます。

165:名称未設定
09/05/27 21:02:10 +XMdFu5wi
>>164
XcodeとiPhone再起動

166:名称未設定
09/05/27 21:15:35 s15SM/9n0
再起動してみました。
現象は変わりませんでした。
オーガナイザには下記のメッセージが出ます。

The Developer Disk Image could not be mounted.
Xcode could not find an appropriate Developer Disk Image to mount
on **** の iPhone. Please contact Apple for the 2.2.1 (5H11) device support package.

翻訳してみると
「Xcodeは、適切なDeveloper Disk Imageを見つけることができませんでした」

iPhoneがおかしいのでしょうか?




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

5388日前に更新/260 KB
担当:undef