7

次のように表示される vc0 というビュー コントローラーがあります。

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

そして vc1 には、別のView Controllerを表示するためのボタンがあります:

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

次に、vc2 に、View Controller を閉じるボタンがあります。

[self dismissViewControllerAnimated:YES completion: ^{
// over here I call one method in vc1
}

そして予想通り、それは vc1 に戻ります。ただし、次のようにビュー コントローラを閉じることによって vc0 に戻るボタンが vc1 にあります。

    [self dismissViewControllerAnimated:YES completion:nil];

しかし、何らかの理由で機能せず、View Controller が vc0 に戻されません。最初に vc1 を表示するときに、ボタンを押してビュー コントローラーを閉じると、機能します。しかし、ボタンを押してvc2を開き、vc2を閉じてvc1に戻し、ボタンを押してView Controllerを閉じると、それが機能しなくなります。

質問が少し不明確な場合は申し訳ありません。私が言おうとしていることを表現するのは少し難しいです。

また、もう1つ:

手動で vc0 を提示するために vc1 を置き換えよdismissViewControllerAnimated:うとしましたが、vc0 を提示しようとしているが、vc1 のビューがウィンドウ階層にないというログがコンソールに表示されます。これは何を意味するのでしょうか?

手伝ってくれてありがとう!

アップデート:

この場合、VC0 はMenuMileIndexViewController- VC1 はFlightViewController- VC2 はBookmarksTableViewController

関連するコードは次のとおりです。

MenuMileIndexViewController:

- (IBAction)goToOriginPage {

FlightRecorder *origin = [[FlightRecorder alloc] init];
[self presentViewController:origin animated:YES completion:nil];

}

フライトレコーダー:

    - (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {

        [self bringUpBookmarkkTable];
}

- (void) bringUpBookmarkkTable {

    BookmarkTableViewController *bookmarkTVC = [[BookmarkTableViewController alloc] init];

    [bookmarkTVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];

    [self presentViewController:bookmarkTVC animated:YES completion:nil];
}

- (IBAction)cancel {

[self dismissViewControllerAnimated:YES completion:nil];

}

- (void)endBookmarkProcessWithBookmarkCollection: (NSDictionary *)dict {

    presetBookmarkContext = [dict mutableCopy];

    bookmarkMode = YES;

    NSString *compiledText = nil;

    NSNumber *number1 = [NSNumber numberWithInt: 1];

    if ([dict objectForKey: @"bookmarkTag"] == number1) {

        compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"origin"], [dict objectForKey: @"destination"]];
    }
    else {

        compiledText = [NSString stringWithFormat: @"%@ to %@", [dict objectForKey: @"destination"], [dict objectForKey: @"origin"]];
    }

    compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Origin: " withString:@""];

    compiledText = [compiledText stringByReplacingOccurrencesOfString:@"Destination: " withString:@""];

    flightContext = [NSDictionary dictionaryWithObjectsAndKeys: [dict objectForKey: @"miles"], @"miles", compiledText, @"location", [[NSUserDefaults standardUserDefaults] objectForKey: @"tempD"], @"date", nil];

    NSString *string = [NSString stringWithFormat: @"\nMiles: %.2f\nFlight: %@\nDate: %@", [[dict objectForKey: @"miles"] floatValue], compiledText, [[NSUserDefaults standardUserDefaults] objectForKey:@"tempD"]];

    UIAlertView *bvkBookmarkAlertView = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:string delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];

    [bvkBookmarkAlertView show];
}



 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [self cancel]; // Even though cancel is an IBAction, IBAction is the same thing as void so it is callable
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [TheMileIndexViewController addDesiredMilesToIndex: [[flightContext objectForKey: @"miles"] doubleValue]];

        [TravelLogViewController addFlight: flightContext];

        if (!bookmarkMode) {

            if ([checkbox isSelected]) {

                [BookmarkHandler uploadBookmark: bookmarkFlightContext];
            }    
        }
    }

    if (buttonIndex == 0) {

        if ([alertView.title isEqualToString: @"Confirmation"]) {

            bookmarkMode = NO;
        }
    }

}

ブックマークTableViewController:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    [tableView deselectRowAtIndexPath:indexPath animated: YES];

    NSDictionary *dict = [[BookmarkHandler bookmarkCollection] objectAtIndex: indexPath.row];

    fl = [[FlightRecorder alloc] init];

    [self dismissViewControllerAnimated:YES completion:^{

        [fl endBookmarkProcessWithBookmarkCollection: dict];
    }];
}

今、シミュレーターでアプリの画面記録を作成し、問題を示しています。参考までに、それをあなたにメールで送ることができます。だから私はあなたにそれをメールすることができます.

4

3 に答える 3

6

デリゲートを使用して、実際にそれを提示した VC から常に VC を却下することをお勧めします。これは、実際には Apple が推奨する方法でもあります。この問題に関する私の質問に対する以前の回答で指摘されたとおりです。

したがって、VC0 が VC1 を提示している場合は、デリゲート スキームを使用して、VC0 にも VC1 コードを破棄します。

VC1 自体の中で VC1 を閉じることができる場合もありますが、これがプレゼンテーションと非表示を処理する最も安全な方法であることを学びました。

私は非常に関連する質問をしました。これもチェックすることに興味があるかもしれません。それはコードを示しています...

ps また、VC1 のみを却下する人もいると読みました。これにより、VC2 も却下されます。ただし、以前の提案が機能する場合は、これを行いません。時々、実行中に VC がもう存在しない (クラッシュではない) という情報を取得することがあります。しかし、私の前の提案がうまくいかない場合は、2 番目の提案を試すことができます。

これが新しい iOS への更新に続くという保証はありませんが、この問題は現在いくつかの iOS の更新を必要としています :-) ので​​、標準の推奨ルートに進むことにしました。

編集:これは私の変更されたコードです-問題なく動作します-しかし、ユーザーがアラートに応答した後に何が起こるのか、アラートがVC1またはVC0のどちらにあるべきかは明確ではありません。とにかく、デリゲートとコールバックを使用しても問題はありません。私があなたの要点を逃した場合は説明してください...

FlightViewControllerProtocol.h

@protocol FlightViewControllerProtocol <NSObject>
-(void) dismissVCAndEndBookmark;
@end

FlightViewController.m

#import "FlightViewController.h"
#import "FlightViewControllerProtocol.h"
#import "BookmarksTableViewController.h"
@interface FlightViewController ()

@end

@implementation FlightViewController
@synthesize delegate;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)searchBarBookmarkButtonClicked:(UISearchBar *)searchBar {

    [self bringUpBookmarkkTable];
}

- (IBAction) bringUpBookmarkkTable {

    BookmarksTableViewController *bookmarkTVC = [[BookmarksTableViewController alloc] init];
    bookmarkTVC.delegate = self;
    [bookmarkTVC setModalTransitionStyle: UIModalTransitionStyleFlipHorizontal];

    [self presentViewController:bookmarkTVC animated:YES completion:nil];
}

- (IBAction)cancel {

    [self dismissViewControllerAnimated:YES completion:nil];

}

- (void)endBookmarkProcessWithBookmarkCollection: (NSDictionary *)dict {

//    presetBookmarkContext = [dict mutableCopy];

//    bookmarkMode = YES;

    NSString *compiledText = nil;

    NSNumber *number1 = [NSNumber numberWithInt: 1];

    if ([dict objectForKey: @"bookmarkTag"] == number1) {

        compiledText = @"Text1";
    }
    else {
        compiledText = @"Text2";
    }


//    flightContext = [NSDictionary dictionaryWithObjectsAndKeys: [dict objectForKey: @"miles"], @"miles", compiledText, @"location", [[NSUserDefaults standardUserDefaults] objectForKey: @"tempD"], @"date", nil];

    NSString *string = compiledText;

    UIAlertView *bvkBookmarkAlertView = [[UIAlertView alloc] initWithTitle:@"Confirmation" message:string delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add", nil];

    [bvkBookmarkAlertView show];
}


- (void) dismissVCAndEndBookmark {
    [self dismissViewControllerAnimated:YES completion:nil];
     [self endBookmarkProcessWithBookmarkCollection: nil];
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        [self cancel]; // Even though cancel is an IBAction, IBAction is the same thing as void so it is callable
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {

        NSLog(@"alertView1");
           }

    if (buttonIndex == 0) {
        NSLog(@"alertView2");

    }

}

@end

BookmarksTableViewController.h

 @interface BookmarksTableViewController : UIViewController
{
    id delegate;
}

@property (nonatomic,strong)   id delegate;

@end

ブックマークTableViewController.m

- (IBAction)goBack {
    [self.delegate dismissVCAndEndBookmark];
}

特に BookmarksTableViewController.m のコールバックは、あなたの意図を正しく理解していれば、実装の主な問題のようです。

于 2012-09-29T06:35:13.093 に答える
6
[self.navigationController popViewControllerAnimated:YES];

私のためにもトリックをしました。私の場合、プッシュ セグエを使用してスタックにプッシュされた (iPhone) viewController がありました。セグエを開始したviewControllerにはナビゲーションバーがあったため、親コントローラのnavigationControllerに、独自のdismissViewControllerAnimated:completionメッセージを呼び出す代わりに、popViewControllerAnimatedメッセージを送信する必要がありました。

レイ

于 2013-04-03T18:20:37.790 に答える
0

最初のビュー:

まず、最初のビューでナビゲーション コントローラーに埋め込みます。このコードを使用して別のビューに移動します

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; 
FirstView *rvc = [storyboard instantiateViewControllerWithIdentifier:@"apps"];
[self.navigationController pushViewController:rvc animated:YES];

2 番目のビュー:

ビューを閉じるためのメソッドにこの行を追加します

- (IBAction)back{
    [self.navigationController popViewControllerAnimated:YES];
}
于 2012-09-29T07:41:14.293 に答える