web-dev-qa-db-ja.com

モーダルビューコントローラーを却下する奇妙な警告

私はiOS6で作業しています。私のアプリケーションには、CustomViewControllerが埋め込まれた標準のナビゲーションコントローラーがあります。このコントローラーでは、次のようなモーダルビューを作成します。

-(IBAction)presentModalList:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    StationsListViewController *list = [storyboard instantiateViewControllerWithIdentifier:@"StationsListViewController"];
    [list setStationsData: [self.stationsData allValues]];
    [self presentModalViewController:list animated:YES];
}

モーダルコントローラーは完全に表示されますが、閉じると警告が生成されます。このコントローラーのdismissメソッドは次のとおりです。

-(IBAction)backToMap
{
    [self dismissModalViewControllerAnimated:YES];
}

生成される警告は次のとおりです。

プレゼンテーションまたは却下の進行中に、View Controller <UINavigationController:0x1ed91620>を却下しようとしました。

それについて何か手がかりはありますか?

ありがとう

19
Sparviero

IOS6をターゲットにすると、これが私にとってうまくいったことです。

if (![self.presentedViewController isBeingDismissed]) 
    [self.presentedViewController dismissViewControllerAnimated:YES
                                                     completion:nil];
0
Yoni Hassin

私はこれが遅い答えであることを理解していますが、おそらくこれはこれに対する解決策を探している他の誰かを助けるでしょう、これが私がしたことです:

-(IBAction)backToMap
{
    if (![[self modalViewController] isBeingDismissed])
        [self dismissModalViewControllerAnimated:YES];
}

私の場合、コード行が複数回呼び出されていることがわかりました。理由がわからなかったため、これが最も簡単な修正でした。

28
JDx

私を正しい軌道に乗せてくれたJDxに感謝します。私はそれをこのソリューションを形成するように適合させました。これにより、iOS6で非推奨となった機能を使用せずに警告が削除されます。

-(IBAction)backToMap
{
    if (![self.presentedViewController isBeingDismissed]) {
        [self dismissViewControllerAnimated:YES completion:^{}];
    }
}
14
Kyle Clegg

このアプローチは信頼できないことがわかりました。たとえば、5人に1人は、まだエラーが表示されます。

私の解決策は、完了ブロックを使用して、閉じても安全かどうかを制御するフラグを設定することでした。これにより、ビューが閉じられているかどうかを確認する必要がなくなります。

-(IBAction)presentModalView:(id)sender {
    :
    self.canDismiss = NO;
    [self presentViewController:aVC animated:YES completion:^{ 
      self.canDismiss = YES; 
     }];
    :
}

却下が発生するコードのビットで、フラグを確認するだけです。

-(void)dismisser {
    :
    if (self.canDismiss) {
      [self dismissViewControllerAnimated:YES completion:nil];
    }
    :
}

ちょっとプレスト、もうエラーはありません!

0
JAWZ apps

Dismissメソッドの完了後、次のように実行できます。

-(IBAction)backToMap
{
    [self dismissViewControllerAnimated:YES
                             completion:^{
                                 //Do something here
                             }];
}
0
giuseppe