7

假设我有 3 个视图控制器,分别标记为“A”、“B”和“C”。现在,“A”是窗口的 rootViewController,当点击按钮时,它以模态方式呈现“B”。在“B”中,当一个按钮被点击时,它应该被“A”关闭,然后“A”将立即以模态方式呈现 C。如何做到这一点?这是我希望实现这一目标的代码,但我没有成功。

在“A”视图控制器中,我声明了一个属性来保存头文件中的一个块,以便在“B”视图控制器被“A”解除时调用。

@property (nonatomic, copy) void (^presentZapLaunch)(void);

这是“A” viewController 呈现“B”的方法

-(void)presentNextViewCon
{
CYCGestureZapZapViewController *gestureViewCon = [[CYCGestureZapZapViewController alloc]init];

if (!self.presentZapLaunch) {
    __weak CYCZapZapViewController *weakRefCon = self;

    self.presentZapLaunch = ^{
        CYCZapZapViewController *preventWeakRefCon = weakRefCon;

        CYCZapZapLaunchViewController *zapLaunch = [[CYCZapZapLaunchViewController     alloc]init];
        NSLog(@"Called");
        [preventWeakRefCon presentViewController:zapLaunch animated:YES completion:nil];

    };
}


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

}

这是由“A”解雇的“B”解雇方法,“A”应立即呈现“C”

-(void)presentNextViewCon
{
NSLog(@"Hello");
[self.presentingViewController dismissViewControllerAnimated:self completion:^{[(CYCZapZapViewController *)self.presentingViewController presentZapLaunch];}];

}

*请注意,我使用“A”视图控制器作为窗口的 rootViewController,“A”以模态方式呈现“B”视图控制器。所有“A”、“B”和“C”都是视图控制器。

4

4 回答 4

9

您可以使用协议来做,例如如下所示:-

在您的 B viewController 设置协议中:

@class Bviewcontroller;

@protocol BviewControllerDelegate <NSObject>
- (void)BviewcontrollerDidTapButton:
(Bviewcontroller *)controller;

@end

@interface Bviewcontroller : UIViewcontroller

@property (nonatomic, weak) id <BviewControllerDelegate> delegate;
- (IBAction)ButtonTap:(id)sender;

@end

在 .m 类中

- (IBAction)ButtonTap:(id)sender
{
    [self.delegate BviewcontrollerDidTapButton:self];
}

现在进入你的 A_viewController .h 类:

#import "Bviewcontroller.h"

@interface A_viewController : UIViewcontroller<BviewControllerDelegate>

.m 类

- (void)BviewcontrollerDidTapButton:
(Bviewcontroller *)controller
{
    [self dismissViewControllerAnimated:YES completion:^{


      // here you can create a code for presetn C viewcontroller 

    }];
}

重要 的是,当您从 A_viewController 预设 Bviewcontroller 时,请勿使用对象设置委托,例如

-(void)presentNextViewCon
{
                bViewcontroller *gestureViewCon = [[bViewcontroller alloc]init];
        gestureViewCon.delegate = self;

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

}

更新

我在这里创建了一个演示,其工作方式如下:

在此处输入图像描述

示例代码链接 http://speedy.sh/2acSC/modelDemo.zip

于 2014-05-29T10:02:33.587 回答
2

您正在考虑一个按钮,我们将其命名为 controlButton。使用自定义初始化方法通过 B 和 C 传递该按钮。这意味着您的 UIViewController A 具有 controllButton 引用。使用方法

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents 

在 A 中设置触发块,就像这样

[_controllButton addTarget:self action:@selector(controllButtonTapped:)....];

- (void)controllButtonTapped:(id)sender {

    [self dismissViewControllerAnimated:YES completion:^{

        // present you c here

        [self presentViewController:c animated:YES completion:NULL];
    }];
}

但最好的选择是使用“中介者设计模式”,其中协调者正在协调你的当前和解雇行动。

于 2014-05-29T10:19:46.013 回答
1

您不能同时解雇 B 和呈现 C。

要执行此任务,您应该遵循一些任务。

  • 按下 'B' 上的按钮时,不带动画地关闭 'B' 并设置一个全局 BOOL 变量以通知您要呈现 'C'。
  • 在 -(void)viewDidAppear:(BOOL) 动画的 'A'

    if (bool){ [self presentViewController:c animated:YES completion:nil]; }

于 2014-05-29T10:41:18.580 回答
1

好像从B到C不简单显示A是不行的,看起来很不专业。但是,您可以在 A 上方放置一个黑色子视图,直到您动画到 C。

在斯威夫特 3 中:

class A : UIViewController {
    ...
    func showB() {
        // Adding the black view before dismissing B does not work;
        // the view is not displayed.
        let black = UIView()
        black.backgroundColor = UIColor.black
        black.frame = self.view.bounds // assumes A is not zoomed

        let b = B()
        self.present(b, animated:true, completion: {
            self.view.addSubview(black)
        })

        // Note: self.present() will start the animation,
        // then b.imDone will be set.  It is done here for
        // clarity of what happens next, as if it were all
        // one function.
        b.imDone = {
            b.dismiss(animated:false, completion: {
                self.present(C(), animated:true, completion: {
                    black?.removeFromSuperview()
                })
            })
        }
    }
}

class B : UIViewController {
    var imDone : (() -> Void)?
    ...
    func f()
    {
        imDone?()
    }
    ...
}

class C : UIViewController
{
    ...
}
于 2017-08-08T23:17:01.690 回答