检测 Viewcontroller 何时被推送
Posted
技术标签:
【中文标题】检测 Viewcontroller 何时被推送【英文标题】:Detect when Viewcontroller was Pushed 【发布时间】:2012-08-12 13:45:05 【问题描述】:我正在尝试检测何时推送 ViewController。 所以我关注了 Apple http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationBarDelegate_Protocol/Reference/Reference.html 的文档,关于 NavegationBar 代表,但我不知道如何让它成功运行。 我在 ViewController 中的代码上放置了以下代码,但它没有检测到它正在推送。 我做错了什么?
- (void)navigationBar:(UINavigationBar *)navigationBar didPushItem:(UINavigationItem *)item,
NSLog(@"didPushItem: %@", item);
[self showimage];
【问题讨论】:
对于UIViewController
类,您应该实现UINavigationControllerDelegate
协议而不是UINavigationBarDelegate
...
【参考方案1】:
不清楚您需要做什么,但有几种UIViewController
方法可以识别其上下文。下面有两个,docs中还有几个
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
BOOL pushed = [self isMovingToParentViewController];
printf("viewWillAppear %d\n", pushed);
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
BOOL popped = [self isMovingFromParentViewController];
printf("viewWillDisappear %d\n", popped);
【讨论】:
谢谢,推的 BOOL = [self isMovingToParentViewController];方法对我有用! 节省的时间...!谢谢【参考方案2】:您应该为UIViewController
和UINavigationController
相关任务实现UINavigationControllerDelegate
。
这里是文档的链接: http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html
协议中不存在您想要的特定方法,例如“navigationController:didPushViewController:animated:
”。
但是,我相信您可以使用navigationController:willShowViewController:animated:
实现所需的行为。请注意,此方法在 UIViewController
的视图显示之前和被推入 UINavigationController
堆栈之后被调用。
【讨论】:
【参考方案3】:-viewWillApear
方法是合理的,但是当视图即将插入视图层次结构时会调用它,这可能是也可能不是您想要的。
如果您想要更多地控制推/拉进度,您可以覆盖
- (void)willMoveToParentViewController:(UIViewController *)parent
if (nil == parent)
// Moving to nil parent means being removed from parent
else
// Will be inserted as a child view controller of <parent>
- (void)didMoveToParentViewController:(UIViewController *)parent
if (nil == parent)
// Moving to nil parent means was just removed from parent
else
// Was just inserted as a child view controller of <parent>
这些将在导航控制器推送/弹出子视图控制器之前和之后调用。
来自文档...
didMoveToParentViewController:
在从容器视图控制器中添加或删除视图控制器后调用。
- (void)didMoveToParentViewController:(UIViewController *)parent
参数
父母
父视图控制器,如果没有父视图控制器,则为 nil。
讨论
当你的视图控制器想要做出反应时,它可以覆盖这个方法 被添加到容器中。
还有……
willMoveToParentViewController:
在视图控制器被添加或移除之前调用 容器视图控制器。
- (void)willMoveToParentViewController:(UIViewController *)parent
参数
父母
父视图控制器,如果没有父视图控制器,则为 nil。
讨论
您的视图控制器可以在需要知道时覆盖此方法 它已被添加到容器中。
【讨论】:
这些都是很好的补充。真的取决于OP试图做什么。这些文档中有很多好东西!以上是关于检测 Viewcontroller 何时被推送的主要内容,如果未能解决你的问题,请参考以下文章
检测 UIAlertController 何时被另一个 UIViewController 解除
如何检测您的 ViewController 是不是是从 AppDelegate 推送的?