web-dev-qa-db-ja.com

presentViewControllerを動作させることができません

作業中の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は起動せず、何も表示されません。

ありがとう

35
user278859

ViewControllerがルートView Controllerである場合、その時点では画面サイズなどの情報がないため、独自のviewDidLoad内からモーダルView Controllerを表示できません。

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

とにかく、あなたのViewControllerにとって、あなたがそれを提示できる最も早いのはそれが見えるようになった後です。これにタイマーを使用することは信頼できません。古くて遅いデバイスでは、ロード時間が劇的に長くなります。

信頼性を高めるには、viewDidAppear: for ViewController。タイマーシステムを使用して、さらに遅延を追加してください。ほんの一瞬で十分なはずです。 iOS 5.1シミュレーターではviewDidAppear内からモーダルビューコントローラーを表示することはできましたが、 別のViewControllerをロードするときにモーダルビューコントローラーを表示する と表示されることがあります。

84
Dondragmer

解決しました。メインビューコントローラーのロードビューからビューを表示しようとしていました。なぜそこで動作しないのかはわかりませんが、代わりに、メインビューが読み込まれた後にView Controllerを表示するメソッドを呼び出すタイマーを設定しています。

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

答えた人に感謝します。

4
user278859

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

- (void)viewDidLayoutSubviews {
    //present here
}
3
SeanChense

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

0
Bagusflyer