2012-04-13 12 views
27

作業中のviewcontrollerクラスを別のプロジェクトから新しいプロジェクトにコピーしました。私は、新しいプロジェクトにロードするビューを取得することはできません。古いプロジェクトではpresentModalViewControllerを使用しました。新しいものでは、presentModalViewControllerまたはpresentViewControllerを使用してロードするビューを取得できません。presentViewControllerを取得できません

現在のビューをメインビューコントローラからロードしようとしています。ここで

// ViewController.h 
#import <UIKit/UIKit.h> 
#import "RequestDialogViewController.h" 

@interface ViewController : UIViewController <RequestDialogViewControllerDelegate> { 

} 

- (void)requestDialogViewDidDismiss:(RequestDialogViewController *)controller withResponse:(NSString*)response; 

私はこのようなpresentModalViewControllerを使用しています...このような

RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil]; 
navigationController = [[UINavigationController alloc] initWithRootViewController:requestIPViewController]; 
[self presentModalViewController:navigationController animated:YES]; 

とpresentViewController ...

...私のメインビューコントローラ・インタフェースは、次のようになります
RequestDialogViewController *requestIPViewController = [[RequestDialogViewController alloc] initWithNibName:@"RequestDialogViewController" bundle:nil];  
[self presentViewController:requestIPViewController animated:YES completion:nil]; 

新しいプロジェクトでは何が欠けていますか? initメソッドは起動しますが、viewDidLoadは実行されず、何も表示されません。代わりに、コピーペーストでそれを入力し、すべての出発のプログラマの利益のために

おかげ

答えて

73

ViewControllerがルートビューコントローラの場合、その時点では画面サイズのような情報がないため、viewDidLoad内からモーダルビューコントローラを表示できません。

すでに他のビューコントローラが表示されている場合は、これが機能します。ルートビューコントローラがUINavigationControllerの場合は、右からスライドして表示され、モーダルビューは下からスライドします。

とにかく、あなたのViewControllerの場合、すぐに表示できるのは表示された後です。このためのタイマーの使用は信頼できません。より古くて遅いデバイスでは、読み込み時間が大幅に長くなります。

さらに信頼性を高めるには、ViewControllerviewDidAppear:を実装してください。追加の遅延を追加するには、タイマーシステムを使用してください。数分の1秒で十分であるはずです。 viewDidAppearのモーダルビューコントローラをiOS 5.1シミュレータで使用してくれましたが、Presenting a modal view controller when loading another ViewControllerは時々起こらないと言います。

+3

を参照してください私には分かりません。私はいつかこれを理解しようと過ごしました。ありがとう。 – rjgonzo

+0

アプリの起動時にこのようなことが起こっている場合 - 提示されたView Controllerが表示される前に、表示中のView Controllerがちらつくことはありませんか?これはどうですか?文脈については、http://stackoverflow.com/questions/14739461/how-do-you-transition-in-a-new-non-model-view-controller-without-using-uinavigat/14739540#14739540を参照してください。 – Marplesoft

+0

iOS 10 Xcode 8 Swift 2.3の場合でもこれは当てはまります。ありがとう! – justColbs

0

はmodalViewControllerを提示。

myVC *viewController = [[myVC alloc]initWithNibName:@"myVC" bundle:nil]; 
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:viewController animated:YES]; 
[viewController release]; 

あなたは、あなたが二番目で間違った方法を使用していた、最初のサンプルのビューコントローラとしてのナビゲーションコントローラを提示しようとしていたように見えます。

+0

実際にあなたはpresentModalViewControllerに関して正しいです。私はそれを私の作業コードから間違ってコピーしました。しかし、presentModalViewControllerが廃止されたので、私は実際にpresentViewControllerを動作させたいと思っていました。私はそれを働かせた...下の私の答えを参照してください。 – user278859

+2

今後の参考として、コピー/ペーストプログラミングは行わないでください。 –

4

私はそれを解決しました。私はビューから主ビューコントローラの負荷を見てビューを提示しようとしていた。確かなぜそれが動作しませんが、その代わり、私は今、メインビューをロードした後、ビューコントローラを提示するメソッドを呼び出し、それが使用して今正常に動作タイマーを設定していない...それらに

[self presentViewController:requestIPViewController animated:YES completion:nil]; 

感謝誰が答えた。

+0

この方法はiOS 6以降でのみ利用可能です –

+4

@ NathanielSymer私はそれが正しいとは思わない。ドキュメントは、presentViewController:animated:completion:はiOS5以上であると言います。 http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/presentViewController:animated:completion: – Marplesoft

0

同じ問題が発生しました。しかし、私の状況はpresentViewControllerが別のViewControllerのdismissViewControllerAnimatedの後に呼び出されます。私の解決策はpresentViewControllerdismissViewControllerAnimatedの完了ブロックに移動することです。

+0

意味があります。なぜなら、別のコントローラを提示する前にコントローラを却下しなければならないからです。 –

2

@Dondragmerは、あなたのviewControllerをルートビューのviewDidLoadに表示したい場合は失敗します。あなたのviewControllerが準備ができたら、新しいviewControllerを表示できます。 それで、あなたはそれを行うことができます

- (void)viewDidLayoutSubviews { 
    //present here 
} 
+1

^あなたがそれを呈示したい回数に依存します:) Daデバッガのブレークポイントは、このことが素早く連続して数回呼び出されることを示しました。 –

関連する問題