6

UIToolbarの下部にアクションボタンがある詳細ビュー(UIWebView)を持つナビゲーションベースのアプリがあります。「メモ」ボタンを押したときに「メモ」を追加したい。Webビューがポートレートモードの場合、すべてが正常に機能します。ノートボタンを押すと、モーダルビューが正常に開き、うまく機能します。

この問題は、Webビューが横向きモードの場合に発生します。メモボタンを押すと、モーダルビューを開くためのすべてのコードが呼び出されますが、取得するのは白い画面だけです。コメント:モーダルビューを縦向きで開いてからデバイスを回転させると、横向きモードに正常に回転します。ランドスケープモードでは正しく 開きません。

同じ動作のメールコンポーザーを表示する別のボタンがあります。これが私のUIWebViewControllerのコードです:

- (IBAction)addNotes:(id)sender 
{
    NotesViewController *notesViewController;

    // create the view controller and set it as the root view of a new navigation
    // controller

    notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];
    UINavigationController *newNavigationController =  
    [[UINavigationController alloc] initWithRootViewController:notesViewController];

    // present the navigation controller modally

    [self presentModalViewController:newNavigationController animated:YES];
    [notesViewController release]; 
    [self.view setNeedsDisplay]; // not sure if I need this!  I was trying different things...
    [self.devotionText setNeedsDisplay]; // ditto...
    [newNavigationController release];
}

何か案は?私はいろいろなことを試しましたが無駄になりました。ナビゲーションバーのない白い画面が表示されます(上部にステータスバーがありますが)。

4

7 に答える 7

7

モーダルは常に回転に関する情報を取得するとは限らず、ステータス バーから情報を取得しますが、これは常に正しく機能するとは限りません。これを viewWillAppear に入れて修正します。[UIApplication sharedApplication].statusBarOrientation = self.interfaceOrientationまた、モーダル内にナビゲーション コントローラーが必要な場合は、作成する必要があります。

また、setNeedsDisplay は必要ありません。これは、提示しているモーダルではなく、現在のビューにのみ影響します。

于 2010-09-22T17:49:34.070 に答える
4

答えはここにあります:

https://stackoverflow.com/a/10250747/1449618

Use the window's root view controller to present:

[self.view.window.rootViewController presentViewController:masterView
                                                  animated:YES
                                                completion:NULL];
于 2012-08-03T22:50:37.033 に答える
2

うわー、私はその問題で何日も無駄にしました...しかし、私は解決策を見つけました!

私はあなたが持っていたのと同じ問題を抱えていました.メソッド「presentModalViewController:animated:」は縦向きモードでしか機能しませんでした。

何度も試行錯誤した結果、その理由は複数のビュー コントローラーが同時にアクティブになっていることが原因であることがわかりました。1 つの親が子を処理して、異なるビュー コントローラーを切り替えるナビゲーション システムを実装しました。(別の外観が必要だったため、UINavigationController を使用できませんでした。)

したがって、ルート ビュー コントローラーにはルート ビュー オブジェクトといくつかの子ビュー コントローラーがありました。子ビュー コントローラーがアクティブ化されると、そのビュー オブジェクトがサブビューとしてルート ビュー コントローラーのビューに追加されました。

「presentModalViewController」メソッドはそれを好みませんでした。しかし、子View Controllerの「parentViewController」プロパティを設定するとすぐに機能しました!

問題は、「parentViewController」が読み取り専用プロパティであることだけです。アクセスできるように、 UIViewController クラスを拡張する必要があります。

@interface UIViewController (HelperExtension)

@property (nonatomic, assign) UIViewController *parent;

@end

@implementation UIViewController (HelperExtension)

- (UIViewController *)parent
{
    return self.parentViewController;
}

- (void)setParent:(UIViewController *)parent
{
    [self setValue:parent forKey:@"_parentViewController"];
}

@end

したがって、子View Controllerのビューを親View Controllerに追加するときはいつでも、それを行った後に「setParent:」メソッドを呼び出します。それならうまくいく!

于 2010-11-04T15:42:57.287 に答える
2

ナビゲーション コントローラーをモーダルに表示するときに同じ問題が発生しました。必ず正しく実装してください: shouldAutorotateToInterfaceOrientation

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    BOOL shouldAutorotate = NO;
    if( isControllerMangingAllOrientations )
    {
        shouldAutorotate = YES;
    }
    else
    {
        shouldAutorotate = (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    }
    return shouldAutorotate;
}

viewDidLoad メソッドでブール値を設定していましたが、良い考えではありません。initWithNibName:bundle: メソッドに入れるのが適切な場所です。

于 2011-11-16T16:03:11.867 に答える
0

私のようにアニメーションのためだけに presentModalViewController を使用する場合は、以下の回答のようにアニメーションで pushViewController を使用できます。

pushviewcontroller アニメーションの表示は presentModalViewController のように見えます

以下のようにviewControllerを閉じることができます。

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionFade;
transition.subtype = kCATransitionFromTop;

[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];

それが役に立てば幸い..

于 2014-06-11T12:35:39.483 に答える
-1

新しいナビゲーション コントローラーは必要ありません。

- (IBAction)addNotes:(id)sender {

 NotesViewController *notesViewController;

 // create the view controller and set it as the root view of a new navigation
 // controller

 notesViewController = [[NotesViewController alloc] initWithPrimaryKey:self.record.primaryKey];

 [self.navigationController pushViewController: notesViewController animated: YES];
 [notesViewController release];
}
于 2010-09-22T17:47:11.173 に答える