6

ナビゲーション コントローラーで管理されている [戻る] ボタンを持つビューがあり、ユーザーが [戻る] ボタンをクリックしたときにファイルが保存されているかどうかを確認したいと考えています。ファイルが保存されている場合は、前のビューに戻ります。それ以外の場合は、ファイルを保存するかどうかを尋ねる uialertview が表示されます。

だから私はそれをしましたが、ビューが消えてアラートビューが表示されます。

-(void)viewWillDisappear:(BOOL)animated {
if(!self.fileSaved){
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Save the file?"  delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes",nil];
    [alert show];
    [alert release];
}
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
switch (buttonIndex) {
    case 0:
        NSLog(@"NO");
        break;
    case 1:
        NSLog(@"yes");
        break;
    default:
        break;
}
}
4

4 に答える 4

6

viewWillDisappear が呼び出された時点では、すでに手遅れです。戻るボタンは早い段階でインターセプトする必要があります。やったことはありませんが、viewDidAppear メソッドの navigationBar プロパティにデリゲートを設定することをお勧めします。

// save the previous delegate (create an ivar for that)
prevNavigationBarDelegate = self.navigationController.navigationBar.delegate;

self.navigationController.navigationBar.delegate = self;

viewWillDisappear に戻すことを忘れないでください:

self.navigationController.navigationBar.delegate = prevNavigationBarDelegate;

次に、shouldPopItem メソッドをインターセプトします。

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
     if(!self.fileSaved) {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Save the file?"  delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes",nil];
         [alert show];
         [alert release];

         return NO;
     }

   if ([prevNavigationBarDelegate respondsToSelector:@selector(navigationBar:shouldPopItem:)]) 
      return [prevNavigationBarDelegate navigationBar:navigationBar shouldPopItem:item];

   return YES; 
}

そして、ダイアログの YES ハンドラーで、コントローラーを手動でポップします。

[self.navigationController popViewController:YES];
于 2009-09-08T22:18:26.480 に答える
4

これを機能させるには、UINavigationController をサブクラス化する必要があります。次に、 (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item をオーバーライドします。ビュー コントローラが採用するカスタム デリゲート プロトコルを設定する必要があります。ポップを許可する場合は、[super navigationBar shouldPopItem:] を呼び出します。それ以外の場合は、上記のメソッドに NO を返します。

于 2010-05-11T16:44:43.563 に答える