• 締切済み

iPhone IBを使用しないでUITabBarControllerを

iPhone IBを使用しないでUITabBarControllerを実装 - (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // UIViewControllerを継承したクラス page1Controller = [[Page1Controller alloc] initWithNibName:nil bundle:nil]; page2Controller = [[Page2Controller alloc] initWithNibName:nil bundle:nil]; // 質問1 tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil]; [tabBarController setViewControllers:[NSArray arrayWithObjects:page1Controller, page2Controller, nil] animated:NO];  // 質問2 [window addSubview:tabBarController.view]; tabBarController.selectedIndex = 1; } 上記プログラムなのですが、 質問1.UITabBarControllerのsetViewControllersメソッドを利用して、     UIViewControllerのインスタンスをセットしているのですが、     setViewControllersメソッドは、     UITabBarControllerのプロパティviewControllersに     値をセットするためのセッターなのでしょうか? 質問2.[window addSubview:tabBarController.view]のviewは、     UITabBarControllerが継承しているUIViewControllerの     view(ゲッター)なのでしょうか? 上記の流れで、UITabBarControllerが、UIVeiwControllerを集約?しているので、 (@property(nonatomic, copy) NSArray *viewControllersとUITabBarControllerのヘルプに明記しているので) WindowのaddSubViewにセットするのは、UITabBarControllerのUIViewControllerのviewじゃないのかな? と初心者ながらの疑問です。 継承などの理解不足があると思いますが、ご教授の程お願いいたします

みんなの回答

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

Nibファイル(.xib)を使わずに、UIWinodwを生成する理由はなんでしょうか?そして、プログラムでUIWindowを生成することは、成功しているのでしょうか? Nibファイルで生成したUIWindowに、UITabBarをaddSubviewすれば、例示のコードのままで、お望みのことが実現するのではないかと思います。 ※質問1,2について、まずちゃんと動くコードを作ってから、お考えになっては、いかがですか?

ques9999
質問者

補足

貴重なお時間、ご教授の程ありがとうございます。 Nibファイルを使わない理由ですが、IBの使い方の勉強ではなく、プログラムの勉強をしたいためです (Javaのswingの勉強の続きとして理解できればと思っております) プログラムでのUIWindow、UINavigationController、UIViewControllerの生成もできております。 質問1,2のプログラムで、起動は、確認しているのですが、 UIWindowのaddsubViewに渡す引数、 UITabBarController.viewが何なのか?が理解できていない状態ですので、 質問した次第です

関連するQ&A

  • iPhoneアプリ とあるプログラムの質問です。

    色々調べたり、書き換えてみたりしたのですが、原因がいまいちよくわかりません。お手上げなので質問させていただきます。 Nabigation-Basedのアプリ製作の中で、テーブル表示から下層画面を選択して、画面遷移をするためのプログラムをRootViewController.mに書いているのですが、シミュレータで実行すると [self.navigationController pushViewController:detailViewController animated:YES]; で、Thread1:Program received signal:"SIGABRT"の表示がでます。(iOS 4.1です) 考えられる原因は何があるでしょうか。ヒントでも構いませんのでよろしくお願い致します。前後の文は下記です。 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { indexPath.section == 0 ; if( indexPath.row == 0 ) { cal_1_UIViewController *detailViewController = [[cal_1_UIViewController alloc] initWithNibName:@"cal_1_UIViewController" bundle:nil]; ☆☆☆[self.navigationController pushViewController:detailViewController animated:YES];☆☆☆→エラーがでます。 [detailViewController release]; }else if( indexPath.row == 1 ) { cal2_UIViewController *detailViewController = [[cal2_UIViewController alloc] initWithNibName:@"cal2_UIViewController" bundle:nil]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; }else if( indexPath.row == 2 ) { cal3_UIViewController *detailViewController = [[cal3_UIViewController alloc] initWithNibName:@"cal3_UIViewController" bundle:nil]; [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; }

  • iPad NavigationにSplitView

    Navigation Basedアプリで、画面遷移してSplitViewを表示したいのです。 以下を参考に、Viewを切り替えてのSplit Viewの表示はできました。 http://temping-amagramer.blogspot.com/2010/09/ipadobjective-c.html LeftTableViewController *lefttableviewcontroller = [[LeftTableViewController alloc] initWithStyle:UITableViewStylePlain]; LeftNavigationController *leftnavigationcontroller = [[LeftNavigationController alloc] initWithRootViewController:lefttableviewcontroller]; RightViewController *rightviewcontroller = [[RightViewControlleralloc] initWithNibName:nil bundle:nil]; RightNavigationController *rightnavigationcontroller = [[RightNavigationController alloc] initWithRootViewController:rightviewcontroller ]; MainSplitViewController *mainsplitviewcontroller = [[MainSplitViewController alloc] init]; mainsplitviewcontroller.viewControllers = [NSArray arrayWithObjects:leftnavigationcontroller,rightnavigationcontroller,nil]; [self.view addSubview:mainsplitviewcontroller.view]; これで、最後の addSubviewしている箇所を [self.navigationController pushViewController:mainsplitviewcontroller animated:YES]; と書き換えれば、Navigation Baseed アプリにも Split Viewが表示されるのでは? と考えたのですが、エラーも出ずにスルーされます。 ちなみに、Split View関連のソースをコピーして、別プロジェクトでsubViewとして表示されるので、 Split View自体のコードは正そうです。 悪い箇所を教えていただけますでしょうか。

  • iOSアプリ起動時にビューを移す方法

    iOSアプリ開発初心者です。 初めてアプリを起動するときに、ビューを"passtest"に移したいのですが、以下のコードを書いたんですが、動作しません。メインコントローラの.mファイル((void)viewDidLoadメソッドの中で)で書きました。 int firstvalue = 1; if (firstvalue==1) { passtest *controller = [[passtest alloc] initWithNibName:@"passtest" bundle:nil]; controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; [controller release]; } IBActionにしてアクションをボタンに割り当てれば、問題なくビューを移せます。 起動時にどうやってビューを移すことができるのでしょうか? iOSアプリに詳しい方がいらっしゃいましたら、ご回答をよろしくお願いします。

  • Objective-c 画面遷移について

    やはり、画面遷移ではまっていますので、助けて下さい。 navigationControllerで作成しています。 (内容は以前に質問させて頂いているものとほぼ同じですが、) 「FirstViewController」はUIScrollViewでスクロールさせている画面で、タッチイベントを取得する為に UIScrollView のサブクラスを作っています。 そこでタッチすると、「SecondViewController」へ遷移するようにしたいのですが、下記のように単純にpushViewControllerを使ってサブクラスへ書くと、「Property 'navigationContoroller' not found on object of type 'MyScrollview'」というエラーが表示されてしまいます。 このクラスへ書いたらいけないというのは、なんとなく分かりますが、かと言って何からどう手をつければ良いのか分かりません…… 問題なく画面遷移させるにはどうしたらよいのでしょうか。 詳しく教えて頂けると、大変助かります。。 ↓FirstViewController.h↓ @interface FirstViewController : UIViewController{   MyScrollview *controller; IBOutlet UIScrollView *scrollView; } ↓FirstViewController.m↓ - (void)viewDidLoad { controller = [[ MyScrollview alloc] initWithFrame:CGRectMake(0, 0, 1100, 1100)]; self.view = controller; [super viewDidLoad]; [super loadView]; scrollView.contentSize = controller.frame.size; [scrollView addSubview:controller]; } ↓MyScrollview .h↓ @interface MyScrollview : UIView<UIScrollViewDelegate>{ } @end ↓MyScrollview .m↓ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{ ~省略~ SecondViewController *mvc = [[[SecondViewController alloc] initWithNibName:nil bundle:nil] autorelease]; [self.navigationController pushViewController:mvc animated:YES]; }

  • iPhoneアプリの開発についてです。

    UINavigationControllerのルートに紐づけられたBookMarkViewControllerというビューがあります。 このBookMarkViewControllerはテーブルビューで、 (1) BookMarkViewController *nextDir = [[BookMarkViewController alloc] init]; [self.navigationController pushViewController:nextDir animated:YES]; 上記のようなコードで、次々と画面遷移していきます。 また、BookMarkViewControllerには、 (2) BookMarkViewController *move = [[BookMarkViewController alloc] init]; move.isMove = YES; UINavigationController *nav = [self.storyboard instantiateViewControllerWithIdentifier:@"BookMarkView"]; [nav setViewControllers:[NSArray arrayWithObjects:move, nil]]; [self presentViewController:nav animated:YES completion:nil]; 上記のような内容のメソッドがあり、次々と画面遷移することのできる新たなUINavigationControllerをモーダル表現で表示します。 画面遷移する前のBookMarkViewControllerでは、上記のコードでうまくモーダルがでるのですが、(1)のメソッドを実行し新たに作り遷移したBookMarkViewControllerではなぜか、 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target <BookMarkViewController: 0x11822e070>.' というエラーが吐き出されうまくいきません。 (2)のメソッドで「nav」を生成した直後にnav.viewControllersをNSLogしてみたのですが、nullがかえされてしまいました。(成功した例では<BookMarkViewController ○○○>と、正常に表示されました) 誰かわかる方ご指摘お願いします。

  • Objective-c  画面遷移について

    毎回、初歩的な質問内容で申し訳ありませんが、困っているので教えて下さい。 「FirstViewController」はUIScrollViewでスクロールさせている画面で、タッチイベントを取得する為に UIScrollView のサブクラスを作っています。 そこでタッチすると、「SecondViewController」へ固定の画面で遷移するようにしたいのですが、「SecondViewController」の画面もそのままスクロール画面で表示されてしまいます。。。 「SecondViewController」をスクロールさせず、位置x=0 y=0で表示させるにはどうしたら良いのでしょうか? 詳しく教えて頂けると、大変助かります。。 ↓FirstViewController.h↓ @interface FirstViewController : UIViewController{   MyScrollview *controller; IBOutlet UIScrollView *scrollView; } ↓FirstViewController.m↓ - (void)viewDidLoad { controller = [[ MyScrollview alloc] initWithFrame:CGRectMake(0, 0, 1100, 1100)]; self.view = controller; [super viewDidLoad]; [super loadView]; scrollView.contentSize = controller.frame.size; [scrollView addSubview:controller]; } ↓MyScrollview .h↓ @interface MyScrollview : UIView<UIScrollViewDelegate>{ } @end ↓MyScrollview .m↓ -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{ SecondViewController *svc; svc = [[SecondViewController alloc] init]; [self addSubview:[svc view]]; }

  • iPhoneアプリの開発についてです。

    UITableViewControllerをaddsubviewに関する質問です。 addsubviewするコントローラーをAddTableViewControllerとすると、 AddTableViewController *addView = [self.storyboard instantiateViewControllerWithIdentifier:@"AddView"]; [self.navigationController.view addsubView:addView.view]; といった感じです。 セルのラベルに文字列もでるんですがテーブルビューを動かす途端セルが消えてしまいます。 また、addView上でアラートを表示しようとするとエラーになるのはなぜなんでしょうか? ご指摘お願いします。

  • Obj-Cで生成元のViewへ文字列を表示させたい

    iOS SDK(Objective-C)を勉強中なのですが、あるView(TestViewController.view)から別のView(ButtonViewController.view)を表示し、表示したViewにあるボタンを押した時に、生成元のView(TestViewController.view)のラベル(test_label)に文字列を表示したいのですが、色々やってみたものの上手く行かず、どの用に実装するのが正しいのか行き詰まってしまいました。どなたか手助けよろしくお願いします。 //*** TestViewController.h #import <UIKit/UIKit.h> #import "ButtonViewController.h" @interface TestViewController : UIViewController { IBOutlet UILabel *test_label; ButtonViewController *buttonViewController; } - (IBAction) pushButton:(id)sender; @end //*** TestViewController.m #import "TestViewController.h" @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; test_label.text = @"Push Button"; } //ButtonViewを表示 - (IBAction) pushButton:(id)sender { buttonViewController = [[ButtonViewController alloc] initWithNibName:@"ButtonView" bundle:nil]; [self.view addSubview:buttonViewController.view]; } - (void)dealloc { [buttonViewController release]; [super dealloc]; } @end //*** ButtonViewController.h #import <UIKit/UIKit.h> @interface ButtonViewController : UIViewController { } - (IBAction) pushButtonSub:(id)sender; @end //*** ButtonViewController.m #import "ButtonViewController.h" @implementation ButtonViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction) pushButtonSub:(id)sender { // ??? ← このボタンを押したときにtest_labelへ表示させたい } - (void)dealloc { [super dealloc]; } @end

  • iPhone プログラミング 

    こんにちは! 下記のように、親Viewにボタンをつけて子View(DANextView)を表示させてます。 -(IBAction)goToNextView:(id)sender { DANextView *nextView = [[DANextView alloc] initWithNibName:@”DANextView” bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:nextView animated:YES]; } そして、その子ViewにAVAudioPlayerの諸々一式を実装しているのですが、下記の様に、 (親View)>(子View)>(音楽再生)>(再生させたまま親Viewに戻る)>(再度子View表示) を行なった所、子Viewで再生中の音楽を制御できマセン。。(停止できない)。 全く新しい子Viewが呼ばれている(?)ような状況です。 どのようにすれば、再表示の子Viewでも、AVAudioPlayerを制御できるようになるのでしょうか?お助け下さい!

  • iphoneプログラミング OpenGL ES

    iOS4.2でOpenGL ESのプロジェクトを作ると EAGLView.[hm] XAppDelegate.[hm] XViewController.[hm] XViewController.xib が自動で出来上がります。これらのファイルを退避しておいて、 新規に View-based applicationを 作ってから、先ほどのEAGLView.[hm]、XViewController.[hm]、XViewController.xib を加えて、XViewControllerを XViewController* vc = [[XViewController alloc] initWithNibName:@"XViewController" bundle:nil]; で作ってみても、例のカラフルな正方形の上下運動は出てきません。 XViewController.xibの画面だけは出てくるようで、試しにその上にボタンを配置して みると、ちゃんとシミュレータ上でそのボタンが現れますが、OpenGL ESの描画というのは 一切ありません。 View-based applicationを作ってその中で OpenGL ESのビューを作りたいのです。 検索するとやり方とかの情報が少しだけありましたが、OpenGL ESの初期化も何も していない単純にビューを結びつけるやり方の様で、自分としてはなるべく OpenGLESの初期化関連が行われている、例の正方形の上下運動ができるコードを 含めている形を求めています。

専門家に質問してみよう