web-dev-qa-db-ja.com

モーダルビューコントローラーは自動的に終了しません

私がやっていること:

私のアプリでは、次のコードを使用してモーダルビューコントローラー(アプリの設定を含む)を提示しています。

    optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentModalViewController:optionsViewController animated:YES];

このトランジションは、ビューの下部を丸くして、いくつかの設定を公開します。 (例については、「マップ」アプリを参照してください。)元のビューはまだ存在するがグレー表示されているページの上半分をタップすると、モーダルビューコントローラーが自動的に閉じられます(OSによって処理されました。 tのコード)。

-

機能していないもの:

これはiOS 4で正常に機能しています(実際、私のアプリは現在App Storeにあります)。しかし、iOS 5では、Appleがこの遷移の動作を変更し、View Controller自体が消えなくなりました。以前はOSで処理されていた動作を再現しようとしています。 、しかし方法を理解することはできません。

-

私が試したもの:

オプションビューの上部に非表示のボタンを追加しても機能しません。その後、ページは完全に丸くなりますが、これは望ましくありません。

これとは別に、私は立ち往生しています。これが元々どのように機能したかを複製する方法(または最初から間違った方法でやっていた!)どんな助けも大歓迎です!

33
Jordan Smith

おい、私は同じ問題に出くわした..そして、ここにparentViewControllerの使用について見つけたものがあります:

5.0以降、これは現在のView Controllerを返さないことに注意してください。

これはUIViewControllerのヘッダーファイルに記述されています...

私はShareKitを使用しており、modalViewControllerはiOS4で完全に機能していましたが、iOS5では、それ自体が却下されません!これは、コードで次を使用しているためです。

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

parentViewControllerはnilを返します。これはモーダル表示のView Controllerであるためです...

解決策を探すことで、あなたの質問を見つけました。だから、私は自分でそれを修正することにしました:P

前の行をこれに変更しました:

    [currentView dismissModalViewControllerAnimated:YES];

魅力のように機能します。


編集:元の質問の解釈方法に応じて、2つの答えがあります。 2番目は次のとおりです。

IOS5では、モーダルコントローラーは、カールをクリックしたときにのみ終了しますが、カールや背景の上ではありません。 iOS5では、実際にモーダルビューを取得して背景またはカールをタップすると自動的に消えるために、次のコードをコントローラーに追加し、モーダルビューのタップを聞きますが、ボタンへのタップは無視します。これは、ページカールでモーダルコントローラーを操作する場合のiOSの以前のバージョンの動作を模倣する必要があります。

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    tap.delegate = self;          
    [backgroundView addGestureRecognizer:tap];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    //change it to your condition    
    if ([touch.view isKindOfClass:[UIButton class]]) {      
       return NO;
    }
    return YES;
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    [self dismissModalViewControllerAnimated:YES];
}
71
Mazyod

モーダルビューコントローラーを閉じるために使用しているコードは何ですか?私はこのようなコードを見てきました:

[self.parentViewController dismissModalViewControllerAnimated: YES];

oSのすべてのバージョンで機能するわけではありません。ただし、これ:

[self dismissModalViewControllerAnimated: YES];

する必要があります。

15
Ben Gottlieb

私は同じ問題を抱えていましたが、以下を使用する人にも影響します:

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

オブザーバーで修正し、却下した場所にこれを追加します:

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];

そして、これは親の親View Controllerで:

// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];

//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
   [self dismissModalViewControllerAnimated:YES];
}

// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];
1
Luis Ascorbe

これは(現在の最終バージョンの)iOS 5で動作するようです。

タップする必要があるのは、ページのカールを消すための特定の領域です-画面の上部の端の近くをタップしても何もしないようですが、ページのカールのグラフィックの上の中央のぼやけた部分は常に消えますモーダルビュー。

その狭いタップ領域の動作がiOS 5の新機能なのか、それとも既に存在していたのかはわかりません。うまくいけば、それが参考になります!

0
benvolioT

IOS5では、モーダルコントローラーは、カールをクリックしたときにのみ終了しますが、カールや背景の上ではありません。 iOS5では、実際にモーダルビューを取得して背景またはカールをタップすると自動的に消えるために、次のコードをコントローラーに追加し、モーダルビューのタップを聞きますが、ボタンへのタップは無視します。これは、ページカールのあるモーダルコントローラーを使用する場合の以前のバージョンのiOSの動作を模倣する必要があります。

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    tap.delegate = self;          
    [backgroundView addGestureRecognizer:tap];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    //change it to your condition    
    if ([touch.view isKindOfClass:[UIButton class]]) {      
       return NO;
    }
    return YES;
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    [self dismissModalViewControllerAnimated:YES];
}
0
user468687

おかげで、これは私に多くの時間を節約しました。 presentModalViewControllerメソッドとdismissModalViewControllerメソッドがUIViewControoler.hのソースコードに従って非推奨になったことに気付きました。代替のpresentViewControllerおよびdismissViewControllerメソッドがあります。

0
Linda Saul