作業中のViewControllerクラスを別のプロジェクトから新しいプロジェクトにコピーしました。新しいプロジェクトにロードするビューを取得できません。古いプロジェクトではpresentModalViewControllerを使用しました。新規では、presentModalViewControllerまたは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は起動せず、何も表示されません。
ありがとう
ViewController
がルートView Controllerである場合、その時点では画面サイズなどの情報がないため、独自のviewDidLoad
内からモーダルView Controllerを表示できません。
他のView Controllerがすでに表示されている場合、これは機能します。ルートView ControllerがUINavigationController
の場合、モーダルビューが下から上にスライドする間に右からスライドするビューが表示されます。
とにかく、あなたのViewController
にとって、あなたがそれを提示できる最も早いのはそれが見えるようになった後です。これにタイマーを使用することは信頼できません。古くて遅いデバイスでは、ロード時間が劇的に長くなります。
信頼性を高めるには、viewDidAppear:
for ViewController
。タイマーシステムを使用して、さらに遅延を追加してください。ほんの一瞬で十分なはずです。 iOS 5.1シミュレーターではviewDidAppear
内からモーダルビューコントローラーを表示することはできましたが、 別のViewControllerをロードするときにモーダルビューコントローラーを表示する と表示されることがあります。
解決しました。メインビューコントローラーのロードビューからビューを表示しようとしていました。なぜそこで動作しないのかはわかりませんが、代わりに、メインビューが読み込まれた後にView Controllerを表示するメソッドを呼び出すタイマーを設定しています。
[self presentViewController:requestIPViewController animated:YES completion:nil];
答えた人に感謝します。
@Dondragmerが言ったように、viewControllerをルートビューのviewDidLoadで表示したい場合、失敗します。viewControllerの準備ができたら、新しいviewControllerを表示できます。だから、あなたはそれをすることができます
- (void)viewDidLayoutSubviews {
//present here
}
同じ問題が発生しました。しかし、私の状況は、別のViewControllerのpresentViewController
の後にdismissViewControllerAnimated
が呼び出されることです。私の解決策は、presentViewController
をdismissViewControllerAnimated
の完了ブロックに移動することです。