【问题标题】:iOS dismiss ViewController callback issueiOS 关闭 ViewController 回调问题
【发布时间】:2013-03-03 00:17:08
【问题描述】:

我有两个 UIViewControllers A 和 B。

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

在我调用dismissViewController: 之后,我需要能够调用父 ViewController 中已呈现 B ViewControllerller 的某些方法。我以为 -viewWillAppear 方法会被调用,但在关闭后它不起作用。

【问题讨论】:

  • 它们都在导航控制器中吗?

标签: ios


【解决方案1】:

当您创建 B ViewController 的对象时,然后实现一个自定义 init 方法,如下所示:

把这个方法放到B ViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withParentView:(UIViewController *)parentViewController
 {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    self.pViewController = parentViewController;
   // Custom code
}
return self;

}

当您创建 B 视图控制器的对象时,然后使用上述方法,您的 parentViewController 将是 self

而在你解雇时,你会打电话

[self.pViewController viewWillAppear:NO];

希望这会对你有所帮助。

万事如意!!!

【讨论】:

  • 所以,我有能力使用 self.parentViewController 属性并调用 viewWillAppear 方法。
【解决方案2】:

解决方案是让“A”视图控制器关闭“B”视图控制器(通过指向 A 视图控制器的指针),然后在完成代码中执行您想要的操作。

iOS6 为视图控制器引入了“rewind”功能,当你有 A 然后 B 然后 C ViewController 时,你可以在出现 C 时倒退到 A。

看看这个link

【讨论】:

    【解决方案3】:

    在您的控制器 B 子类中,为控制器 A 创建一个属性。

    @property (nonatomic, strong) ControllerA *controllerA;

    在呈现控制器 B 之前,设置属性:

    [controllerB setControllerA:self];

    当您关闭控制器 B 时,使用完成块调用您要执行的控制器 A 的方法:

       [self dismissViewControllerAnimated:YES completion:^{
            [self.controllerA doSomething];
        }];
    

    (一个可能的问题是,如果控制器A 在控制器B 之前被释放,你最终会得到一个保留周期。如果是这种情况,你最好将控制器A 设置为控制器B 的代表并使用非正式协议)

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2016-09-17
      • 1970-01-01
      • 2012-04-30
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      相关资源
      最近更新 更多