使用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的各个方法。