检测 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】:

您应该为UIViewControllerUINavigationController 相关任务实现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 推送的?

iOS 9:如何检测用户何时对推送通知请求说“不允许”? [复制]

如何检测自定义表格视图单元格何时离开屏幕?

快速检测 Viewcontroller 上的第一次触摸

iOS 开发/生产推送证书:何时以及如何?