6

背景:以前に提示した modalView をviewController却下し、新しい情報で却下したものと同じものをすぐに提示したいと思います。

問題:最初のモーダルViewControllerを提示した親への明示的なポインターがないと、うまくいきませんでした。以前の のコードViewControllerをいじらずに機能するこのクラスを作成しようとしています。viewController

可能性のあるリード:私が実験してきたことがいくつかあります:

1.) 親にアクセスしようとしていますが、ViewController現時点では方法がわかりません。

2.) 親へのアクセスを取得したら、次のコードを適用するだけです。

UIViewController* toPresentViewController = [[UIViewController alloc] init];
    [self dismissViewControllerAnimated:YES completion:^{
        [parentViewControllerAccessor presentModalViewController:toPresentViewController animated:YES];
}];

理論的には、これは parent へのアクセスがあれば機能するはずviewControllerです。私はこれを行う他の方法を受け入れます。

前提:親のコードを変更する権限がありませんViewController

4

4 に答える 4

10

コードは機能するはずです。iOS 5を使用している場合は、というUIViewControllerプロパティがありますpresentingViewController

@property(nonatomic, readonly) UIViewController *presentingViewController;

したがって、このプロパティを使用して、モーダルコントローラーを表示するビューコントローラーを取得できます。

注: iOS 4parentViewControllerでは、現在のコントローラーに設定されるため、iOS 4と5の両方をサポートしている場合は、最初にOSのバージョンを確認して、アクセスするプロパティを決定する必要があります。iOS 5では、Appleはこれを修正し、含まれているView ControllerparentViewControllerの親にのみ使用されるようになりました(ドキュメントのContainer View Controllerの実装に関するセクションを参照してくださいUIViewController

編集:ブロック内からのアクセスについてself.presentingViewController:ブロックが呼び出されるまでに(モーダルビューコントローラーが閉じられた後)、presentingViewControllerプロパティはnilに設定される場合があります。self.presentingViewControllerブロック内では、ブロックが作成されたときではなく、実行されたときにプロパティの値が与えられることに注意してください。これを防ぐには、次のようにします。

UIViewController* toPresentViewController = [[UIViewController alloc] init];
UIViewController* presentingViewController = self.presentingViewController;
[self dismissViewControllerAnimated:YES completion:^
{
    [presentingViewController presentModalViewController:toPresentViewController animated:YES];
}];

これが必要なのは、selfなくなった/却下された(ブロックによって安全に保持されている)ためではなく、表示されなくなったため、presentingViewController現在はnilになっているためです。他の場所に格納する必要はありませんpresentingViewController。ローカル変数はブロックによって保持されるため、問題ありません。

于 2012-06-11T21:00:11.713 に答える
1

iOS5のソリューション:

-(void)didDismissModalView:(id)sender {

   // Dismiss the modal view controller
   int sold=0;

   if(sold==0){

      //Cash_sold.delegate = self;
      // Cash_sold.user_amount.text=[NSString stringWithFormat:@"%d",somme];

      Cash_sold = [[CashSoldview alloc] initWithNibName:@"CashSoldview" bundle:nil];
      CGRect fram1 = CGRectMake(200,20,400,400);
      Cash_sold.view.superview.frame = fram1;
      Cash_sold.view.frame=fram1;
      Cash_sold.modalTransitionStyle= UIModalTransitionStyleCoverVertical;
      Cash_sold.modalPresentationStyle=UIModalPresentationFormSheet;

      UIViewController* presentingViewController = self.parentViewController;

      [self dismissViewControllerAnimated:YES completion:^
      {
         [presentingViewController presentModalViewController:Cash_sold animated:YES];
      }];     
   }
}
于 2012-07-26T13:51:53.270 に答える
1

これは、通知を使用して実現できます。

たとえば、モーダル ビューを閉じたい場合は、モーダル ビューの外からこの通知を起動します。

[[NSNotificationCenter defaultCenter] postNotificationName:@"dismissModalView" 
                                                    object:nil 
                                                  userInfo:nil];

次に、モーダル ビュー内でその通知を処理します。

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(dismissMe:)
                                                 name:@"dismissModalView" 
                                               object:nil];
}

- (void)dismissMe:(NSNotification)notification {
    // dismiss it here.
}
于 2012-06-11T20:59:31.620 に答える
1

次のコードを試してください。

[self dismissViewControllerAnimated:NO 
                         completion:^{
  // instantiate and initialize the new controller
  MyViewController *newViewController = [[MyViewController alloc] init];
  [[self presentingViewController] presentViewController:newViewController
                                                animated:NO
                                              completion:nil];
}];
于 2012-07-26T14:32:16.097 に答える