ページ 11

iphoneでの画面遷移方法について

Posted: 2010年10月03日(日) 23:56
by グルグル
はじめまして。初めての投稿になります。最近iphoneの開発を始めたのですが、どうしても画面遷移方法がわからず、悶々としております。
基本的なこととは思いますが、ご教授頂きたくお願いします。
【やりたいこと】
 ・View-based Applicationで作成し、複数Viewを用意して、各View上にボタンを配置し、
  単純にViewを切り替える(画面遷移)。
【どこまで実装できたか】
 ・とあるサイトのサンプルソースを参考+自力にて以下まで作成。
  画面1(View1)がアプリ起動後表示され、画面1上のボタンを押下すると
  画面2(View2)に切り替わる。
  画面2上にもボタン(戻る)を作成し、このボタンを押下すると
  画面1に戻る。
【困っている事】
  上記実装までいったのですが、また、画面1から画面2に遷移させる方法がわからない。
  そもそもの考え方が間違っているのかがわからない。
  一旦、考えてみたが、ビルドーエラー5個発生。
  ※次項目が具体的な内容です。
【具体的な内容】  
  画面1上のボタンを押下時のアクション関数の内容 (nextPage())

- (IBAction)nextPage:(id)sender {
//画面2のxibを読み込んで、画面2のView、ViewControllerを作成
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
//画面2のクラスに画面1のViewを保持しておく。。。このサンプルコードを見た時は、戻る時にこのViewを使うのだと認識。。A
nextViewController.parentController=self;
   //画面2を表示(切替える)
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
}
  このアクションで画面1→画面2はOK
  そして、画面2→画面1時、画面2上のボタン押下時のアクション関数は以下。(bakPage())
- (IBAction)backPage:(id)sender {
//nextPage()関数にて、画面1のViewは、parentControllerに格納されていたので(上記A)、この変数を使って表示を切替えた。
[self presentModalViewController:parentController animated:YES];
}

  このアクションで、画面2→画面1はOK

さて、また、画面1→画面2に行きたい。nextPage()を呼ぶ!
そうすると、落ちる。これは、再度、画面2のxibを呼ぶことにより、なんかおかしくなるんだろうと想像。
ならば、フラグ制御して、いろいろ調べてみよう。。。と nextPage()関数を以下に改造。
- (IBAction)nextPage:(id)sender {
  //姑息な手段でフラグ制御 goFlag=0の時、最初なので、xibにて画面2を作成。 
if(goFlag==0) {
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
nextViewController.parentController=self;
//次回画面2に行くために画面2のViewを保持しておこう。 B
(Seni2ViewController*)childController=nextViewController;
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
goFlag=1;
}
else {
     //この処理は、goFlag=1で、2回目以上の時だから、上記Bの変数を使って画面2のViewを切り替える想定。
[self presentModalViewController:(Seni2ViewController*)childController animated:YES];
}
}


【困っている事】にも書きましたが、そもそも画面遷移ってこういう考えで実装するのでしょうか。
  
また、ビルドエラー(5個)は、次のエラー(←の部分)ですが、何がいけないのかがわかりません。。。
※実際は、ボタン、アクション関数などを定義していますが、省略しています。

<画面1分>
#import <UIKit/UIKit.h>
#import "Seni2ViewController.h"

@interface SeniViewController : UIViewController {
Seni2ViewController *childController;   ←エラー:Expected specifier-qualifier-list before SeniViewController
}

@property (nonatomic,retain) Seni2ViewController *childController;
↑エラー:Expected specifier-qualifier-list before SeniViewController


@end

<画面2分>
#import <UIKit/UIKit.h>
#import "SeniViewController.h"


@interface Seni2ViewController : UIViewController {
SeniViewController *parentController;   ←エラー:Expected specifier-qualifier-list before SeniViewController
}

@property (nonatomic,retain) SeniViewController *parentController;
↑エラー:Expected specifier-qualifier-list before SeniViewController

@end

あと、goPage()のアクション関数にもエラー

(IBAction)nextPage:(id)sender {
  :
   (省略)
nextViewController.parentController=self; ←Request for member 'parentController' in something not a structure or union
 :
   (省略)
}

※parentController およびchildController の@synthesize定義はしています

長々と申し訳ありません。何かきっかけを頂ければ幸いです。
よろしくお願いいたします。
※インデントがバラバラ表示で見にくく、申し訳ありません。

Re:iphoneでの画面遷移方法について

Posted: 2010年10月04日(月) 04:02
by
はじめまして。

3D周りの情報を探していてたまたまこのスレッドに流れつきました。

斜め読みです&IBを使わなくなっちゃってるので的外れかもしれません。参考まで。m(__)m


画面1から画面2に移るときに
モーダルビューで移動してるようなので、
画面2から
[self dismissModalViewControllerAnimated:YES];
みたいにしたらどうでしょうか。

具体的には下記の箇所を、

>- (IBAction)backPage:(id)sender {
> //nextPage()関数にて、画面1のViewは、parentControllerに格納されていたので(上記A)、この変数を使って表示を切替えた。
> [self presentModalViewController:parentController animated:YES];
>}



>- (IBAction)backPage:(id)sender {
> [self dismissModalViewControllerAnimated:YES];
>}

Re:iphoneでの画面遷移方法について

Posted: 2010年10月04日(月) 04:20
by
途中で投稿しちゃいました。。。といいつつ、後者のように書けばいけるんじゃないかなぁ、、と。


ついでにサンプル組んでみたのをアップロードしたいのですが、容量制限に引っかかってうまくいかないです。。。


>【困っている事】にも書きましたが、そもそも画面遷移ってこういう考えで実装するのでしょうか。


モーダルビューでの移動はログイン画面とか一時的な画面に使う印象がありますね。あと、戻ることを前提としているような。


階層型構造でたどって移動するときには、UINavigationControllerでのpush&popなきがします。用途次第なかんじですね。

Re:iphoneでの画面遷移方法について

Posted: 2010年10月04日(月) 23:26
by グルグル
..ぴよぴよさん ありがとうございました。
何だか狐につままれた感じです。遷移しました。

画面1から画面2に遷移するアクション関数 nextPage()と
画面2から画面1に遷移するアクション関数 backPage()を以下のように書き換えました。
画面2から画面1へは、仰せの通り、書き換えました。


//画面1から画面2へ
- (IBAction)nextPage:(id)sender {
Seni2ViewController *nextViewController=[[Seni2ViewController alloc]initWithNibName:@"Seni2ViewController" bundle:[NSBundle mainBundle]];
[self presentModalViewController:nextViewController animated:YES];
[nextViewController release];
}

//画面2から画面1へ
- (IBAction)backPage:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}


【自分なりの結論】
 そもそもModalViewControllerの性質をわかっていない気がしています。
 
画面1上ボタンを押下するとnextPage()が呼ばれますが、
毎回、xibで画面2がインスタンス化されることになりますが、
それは上書きされるので、それはそれでよい(のかな。。。)。
画面2を表示して、自分で消える。。という考えですね。

では、さらに、画面2に画面3を作る。。。これも同じような気がしていますが、
(直線的な遷移になりますよね。。。1→2→3→2→1→2→3→2→3→×1は無しですよね)
でもでもでも。。。
そういう画面はModalViewControllerではなく、ViewNavigationControllerを使用した方がいいのではないか。。。

画面インターフェースも理解(実感)していないので、出直してきます。

ありがとうございました。

Re:iphoneでの画面遷移方法について

Posted: 2010年10月05日(火) 02:45
by
遷移できたようでよかったです。

>画面1上ボタンを押下するとnextPage()が呼ばれますが、
>毎回、xibで画面2がインスタンス化されることになりますが、
>それは上書きされるので、それはそれでよい(のかな。。。)。
>画面2を表示して、自分で消える。。という考えですね。

[nextViewController release];
で開放するので、

次回もalloc&initで新しくインスタンス生成していて、
上書きにはならないんじゃないかなと思ったりします。

自分で消えるという考えかたでOKだと思います。



もし画面3まで作成するのでしたら、
モーダルでもできなくはないような気がするのですが、
用途を推測すると、UINavitionControllerを使って、

1=>2や2=>3のときは、
&#8211; pushViewController:animated:
を使う。

3=>2や2=>1のときは、
&#8211; popViewControllerAnimated:
をつかう。

3=>1のときは、
&#8211; popToRootViewControllerAnimated:
を使うのがいいんじゃないかなと思ったります。

Re:iphoneでの画面遷移方法について

Posted: 2010年10月05日(火) 08:20
by グルグル
‥ぴよぴよさん
フォローありがとうございます。
非常にうれしいです。
メモリ管理が把握できてないのですが、
インスタンス作成して、画面切り替えて、releaseする…
それも連続して処理するソースコードですね…
画面というのは、リソースとして、別管理なんですかね…


ピンときませんが…
うーん
いろんな例を見てみます
ありがとうございました

Re:iphoneでの画面遷移方法について

Posted: 2010年10月06日(水) 00:18
by グルグル
画面遷移が自分なりに学習できる本を見つけました。
ちょっと古い本ですが、がんばってみます。
ありがとうございました。
..ぴよぴよさん スイマセンでした。名前は ら さんだったんですね。
見間違えていました。失礼いたしました。