iOS:如何检测视图控制器是不是在弹出或关闭后出现

Posted

技术标签:

【中文标题】iOS:如何检测视图控制器是不是在弹出或关闭后出现【英文标题】:iOS: how to detect if viewcontroller appears after pop or dismissiOS:如何检测视图控制器是否在弹出或关闭后出现 【发布时间】:2015-10-29 20:46:03 【问题描述】:

我有一个视图控制器 VC1,我正在对其进行以下两个操作:

    通过调用从 VC1 的导航控制器推送另一个视图控制器 VC2

[VC1.navigationController pushViewController: animated:YES];

    通过调用从 VC1 呈现另一个视图控制器 VC3。

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:VC3]; [VC1 presentViewController:navController animated:YES completion:nil];

现在当我从 VC2 到 VC1 时,我正在打电话

[VC2.navigationController popViewControllerAnimated:YES];

我正在从 VC3 到 VC1 调用

[VC3.navigationController dismissViewControllerAnimated:YES completion:nil];

我的问题是当我回到 VC1 时,我如何知道我是来自 VC2(通过解雇)还是 VC3(通过弹出)?

注意:VC1 在父视图控制器 VC4 中作为子视图控制器加载。

【问题讨论】:

“我的问题是当我回到 VC1 时,我如何知道我是来自 VC2(通过解雇)还是来自 VC3(通过弹出)?”问题是难闻的气味。你应该问自己为什么你认为你需要知道这一点。 回复 matt 的评论:因为我需要根据返回的位置以不同的方式更新我的 VC1 的 UI 元素。 没有。呈现的视图控制器或推送的视图控制器,它们应该更新任何需要更新的东西,这样当 VC1 得到viewWillAppear: 时,它就可以根据自己的属性确切地知道要做什么。或者,更好的是,VC1 有两个方法,其中一个将由呈现的 v.c. 调用,另一个将由推送的 v.c. 调用。更好地准备您的通信取决于您。不要使用诸如“我出现是因为推送的视图控制器被弹出”之类的东西来避免正确地完成这项工作。 【参考方案1】:

最好的方法是让 childViewController 回调呈现视图控制器。通过这样做,childViewController 将不需要知道它是以模态方式呈现还是在导航堆栈中呈现等的实现细节。

有了块,它看起来像

@interface VC2 : UIViewController

@property (nonatomic, copy) void (^completion)(VC2 *viewController);

@end

你可以像这样设置这个块

VC2 *viewController = VC2.new;
viewController.completion = ^(VC2 *viewController) 
  [viewController.navigationController popViewControllerAnimated:YES];
;

[VC1.navigationController pushViewController:viewController animated:YES];

现在你之前调用的地方

[VC2.navigationController popViewControllerAnimated:YES];

你改为调用

self.completion(self);

你将任何你想要关联的逻辑从一个特定的 viewController 中返回到完成处理程序中

【讨论】:

以上是关于iOS:如何检测视图控制器是不是在弹出或关闭后出现的主要内容,如果未能解决你的问题,请参考以下文章

interactivePopGestureRecognizer - 弹出或返回当前视图控制器

ios 键盘在弹出后无法点击

iOS 弹出框在关闭后不会消失

当视图控制器弹出或推入导航控制器堆栈时如何获得通知

如何从标签栏控制器弹出或模态显示视图控制器?

Swift IOS在弹出后保持视图控制器在后台运行