• 使用AppDelegate单例,解决子视图无法给父视图发送消息的问题


    关于单例模式,我会在实验过后再开一个博客重点讲单例的使用,这里只是介绍我在PhotoForBingyan的照片滤镜的项目中使用AppDelegate单例的情况。

    碰到的问题:

    由于这个项目是个多视图的项目,我使用了Controller作为父视图来管理各个子视图视图,然后出现了一个状况:当我在子视图进行操作的时候,我没有办法给父视图传递消息,也就没有办法控制当前视图的转换。

    解决办法:

    通过AppDelegate的单例获得父视图的实例,然后通过父视图的实例方法进行视图的转换。

    具体实现:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    {

        self.window = [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];

        // Override point for customization after application launch.

        self.viewController = [[ViewControlleralloc] initWithNibName:@"ViewController"bundle:nil];

        self.window.rootViewController = self.viewController;

        [self.windowmakeKeyAndVisible];

        returnYES;

    }

    以上为AppDelegate中自带的函数,我使用的是ViewController作为根视图,ViewController的实例在AppDelegate中的属性为viewController或者window.rootViewController。上面的代码中都有定义,任意一个都能获取到VIewController的实例。

        AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];

    其实这里可以看到,AppDelegate并不是真正的单例,真正的单例是UIApplication,它的SharedApplication方法是一个正式的单例方法,能够返回UIApplication的单例。由于AppDelegate也是iOS中唯一存在的一个实例,所以在iOS的默认程序里面都把AppDelegate作为UIApplication的委托处理,只要得到了UIApplication的单例,就可以通过delegate方法轻松获得AppDelegate的实例

    [(ViewController *)appDelegate.viewControllergetbackView];

    接下来就可以通过ViewController的属性轻松获得ViewController的实例,也就能运行它的方法了。这里需要注意的一点是最好使用强制转换运算,这样系统才能识别VIewController的各个方法。

  • 相关阅读:
    软件开发规范
    Fail2ban + firewalld 防护doss攻击
    SourceTree&Git部分名词解释
    训子
    一个网络下,手机如何访问本地网址
    tempalte.js的一般用法
    template.js的介绍
    获取URL中的参数
    js判断苹果和安卓端或者wp端
    HTML5与WebGL编程
  • 原文地址:https://www.cnblogs.com/wisejoker/p/3399852.html
Copyright © 2020-2023  润新知