是否有任何委托方法可以检测ios应用程序中故事板中场景何时发生变化?

时间:2014-10-29 12:57:52

标签: ios objective-c iphone

我知道这样做的一种方法。那就是" viewDidLoad"将在场景发生变化时调用。还有其他方法可以检测故事板中场景何时发生变化,因为我希望在场景发生变化时调用一种方法。我正在为ios应用程序开发SDK我不能要求应用程序开发人员在每个场景上调用方法(我想改进它),所以我想在场景发生变化时自动检测并在那里调用我的方法。请帮助我们正在尝试从这么多天来做这件事,但没有找不到任何关于它的事情。

3 个答案:

答案 0 :(得分:-1)

你需要做的就是调动UIKit的-[UIViewController viewDidLoad]方法,
所以你需要做3个步骤

  1. 抓住-[UIViewController viewDidLoad]来电
  2. 调用原始-[UIViewController viewDidLoad]方法
  3. 你是否进行了初始化。
  4. 以下是您问题的完整解决方案

    1)UIViewController类上名为“Initialization”的Crate类别
     2)复制下面的代码
     3)在// Your init here

    处插入初始化代码
    #import <objc/runtime.h>
    
    @implementation UIViewController (Initialization)
    
    + (void)load
    {
        swizzleInstance(@selector(viewDidLoad),
                        @selector(viewDidLoad_m),
                        [UIViewController class],
                        [self class]);
    }
    
    static void swizzleInstance(SEL originalSl, SEL swizzledSl, Class originalCl, Class swizzledCl) {
        Method originalMethod = class_getInstanceMethod(originalCl, originalSl);
        Method swizzledMethod = class_getInstanceMethod(swizzledCl, swizzledSl);
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
    
    - (void)viewDidLoad_m
    {
        [self viewDidLoad_m];
    
        // Your init here
    }
    

答案 1 :(得分:-1)

viewDidLoad仅在第一次显示视图时被调用。如果你保持视图控制器然后返回它,那么它将不会被再次调用。 (对于Storyboard,大多数人只是在用户关闭它时丢弃一个视图控制器,然后在返回时重新创建它,所以这可能不是问题,但重要的是要注意它。)

我会建议反对方法调整,如另一张海报所建议的那样。

相反,您可能会考虑为所有视图控制器创建自定义基类。在该基类中实现viewWillAppear和viewWillDisappear方法。在这些方法中,您可以广播通知或发送其他类型的消息,以便跟踪视图控制器的显示/解除。

实现viewWillAppear:animated或viewWillDisappear:animated的所有视图控制器都应该调用super,因此子类仍然应该调用这些方法的超级版本。

答案 2 :(得分:-1)

viewDidLoad并不表示您的场景已完全切换。请考虑以下事项:

UIViewController *myViewController = [[UIViewController alloc] init];
[myViewController.view addSubview:someView]; // viewDidLoad is called as a result of accessing the view property here
myViewController = nil; // the view controller is thrown away and the scene is never changed.

相反,您应该使用viewWillAppear:viewDidAppear:viewWillDisappear:viewDidDisappear:。这些都是UIViewController子类可以覆盖的方法。