UI控件笔记(七):UI之五种传值方式 代理\单例\缓存\通知\正向
2016-05-17 10:13
483 查看
一、传值简介
AAAA
代理: 1V1 A->B,B回A的时候使用
BBBB
单例: 无所谓
整个应用都要用的数据,存一个应用内的全局值,ios6?ios7
CCCC 缓存:
为所谓 整个应用都要用的数据,保证下次启动还有点数据,账号、密码
DDDD 通知: 1V多
犯懒的时候,A发通知,B观察通知,B在A之前,比较占资源
E 正向传值:A->B,B的内容由A来定,那么B应该有一个属性,A->B的时候给B的属性赋值
二、举例
1、AppDelegate.m文件中的写法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow
alloc] initWithFrame:[UIScreen
mainScreen].bounds];
self.window.backgroundColor = [UIColor
whiteColor];
FirstViewController *first = [[FirstViewController
alloc]
init];
UINavigationController *nav = [[UINavigationController
alloc]
initWithRootViewController:first];
[first release];
self.window.rootViewController = nav;
[nav release];
[self.window
makeKeyAndVisible];
return
YES;
}
2、FirstViewController.m文件中的写法
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "SingleTon.h"
@interface
FirstViewController ()<SecondDelegate>//AAAA
代理声明可以写这里
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor
redColor];
//DDDD
通知中心
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(notify:)
name:@"pp"
object:nil];
//第三个参数:这里专门等着接的通知名
//第一个和第二个参数:截到对应通知名的通知后,用第一个参数去执行第二个参数的方法
// Do any additional setup after loading the view.
}
-(void)notify:(NSNotification*)noti
{
UIColor *color = [noti
object];//发通知的时候传过的参数,就是这里的这个noti,无论什么类型的参数,都用object去解析,解析完了,发的时候是什么类型,就是什么类型
self.view.backgroundColor = color;
}
//touch事件,去第二个页面
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"松手了");
SecondViewController *second = [[SecondViewController
alloc]
init];
second.delegate =
self;//AAAA
被触发者的第二件事儿
[self.navigationController
pushViewController:second animated:YES];
[second release];
}
//AAAA 实现代理的方法
-(void)getColor:(UIColor *)color
{
self.view.backgroundColor = color;
}
-(void)viewWillAppear:(BOOL)animated
{
static int num =
0;
if(num != 0)
{
[self single];
[self userdefaults];
}
num++;
}
-(void)single//BBBB
单例
{
SingleTon *single = [SingleTon
shareInstance];//还是那个
self.view.backgroundColor = single.color;
}
-(void)userdefaults//CCCC
缓存
{
NSArray *colorArr =
@[[UIColor
redColor],[UIColor
yellowColor],[UIColor
blueColor]];//数组存三色
int num = [[[NSUserDefaults
standardUserDefaults] objectForKey:@"color"]
intValue];
self.view.backgroundColor = colorArr[num];
}
3、SecondViewController.h文件中的写法
#import <UIKit/UIKit.h>
AAAA 声明代理
@protocol SecondDelegate <NSObject>
-(void)getColor:(UIColor*)color;
@end
@interface SecondViewController :
UIViewController
@property(nonatomic,assign)id<SecondDelegate>delegate;
@end
4、SecondViewController.m文件中的写法
#import "SecondViewController.h"
#import "SingleTon.h"
@interface
SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor
greenColor];
[self makeBtn];
// Do any additional setup after loading the view.
}
-(void)makeBtn
{
NSArray *arr =
@[@"red",@"yellow",@"blue"];
for(int i =0;i<arr.count;i++)
{
UIButton *btn = [UIButton
buttonWithType:UIButtonTypeRoundedRect];
btn.frame =
CGRectMake(0,
64+i*60, 320,
60);
[btn setTitle:arr[i]
forState:UIControlStateNormal];
[btn addTarget:self
action:@selector(btnDown:)
forControlEvents:UIControlEventTouchUpInside];
[self.view
addSubview:btn];
btn.tag =
1000+i;
}
}
-(void)btnDown:(UIButton*)btn
{
NSArray *colorArr =
@[[UIColor
redColor],[UIColor
yellowColor],[UIColor
blueColor]];//数组存三色
//该传值了
[self delegateMethod:colorArr[btn.tag -
1000]]; AAAA
[self singleMethod:colorArr[btn.tag -
1000]]; BBBB
[self userdefaultsMethod:btn.tag -
1000]; CCCC
[self notificationMethod:colorArr[btn.tag -
1000]]; DDDD
[self.navigationController
popViewControllerAnimated:YES];
}
-(void)delegateMethod:(UIColor*)color//AAAA
代理
{
[self.delegate
getColor:color];
}
-(void)singleMethod:(UIColor*)color//BBBB
单例
{
SingleTon *single = [SingleTon
shareInstance];
single.color = color;//给单例的属性赋值
}
-(void)userdefaultsMethod:(int)color//CCCC
缓存
{
NSUserDefaults *user = [NSUserDefaults
standardUserDefaults];
[user setObject:[NSString
stringWithFormat:@"%d",color]
forKey:@"color"];
[user synchronize];
}
-(void)notificationMethod:(UIColor*)color//DDDD
通知
{
//1、做一个通知中心
NSNotificationCenter *center = [NSNotificationCenter
defaultCenter];
//2、做一个通知内容
NSNotification *notify = [NSNotification
notificationWithName:@"pp"
object:color];//第一个参数:通知名,第二个参数:通知携带的参数
//3、用通知中心把通知内容post出去,然后就不管了
[center postNotification:notify];//中心调方法,内容是参数
}
5、SingleTon.h单例写法 BBBB
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface SingleTon :
NSObject
@property(nonatomic,retain)UIColor *color;//用来保存全局颜色的
+(id)shareInstance;
@end
6、SingleTon.m单例写法 BBBB
#import "SingleTon.h"
static SingleTon *single =
nil;
@implementation SingleTon
+(id)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [SingleTon
alloc];//这里只走一次
});
return single;
}
@end
AAAA
代理: 1V1 A->B,B回A的时候使用
BBBB
单例: 无所谓
整个应用都要用的数据,存一个应用内的全局值,ios6?ios7
CCCC 缓存:
为所谓 整个应用都要用的数据,保证下次启动还有点数据,账号、密码
DDDD 通知: 1V多
犯懒的时候,A发通知,B观察通知,B在A之前,比较占资源
E 正向传值:A->B,B的内容由A来定,那么B应该有一个属性,A->B的时候给B的属性赋值
二、举例
1、AppDelegate.m文件中的写法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow
alloc] initWithFrame:[UIScreen
mainScreen].bounds];
self.window.backgroundColor = [UIColor
whiteColor];
FirstViewController *first = [[FirstViewController
alloc]
init];
UINavigationController *nav = [[UINavigationController
alloc]
initWithRootViewController:first];
[first release];
self.window.rootViewController = nav;
[nav release];
[self.window
makeKeyAndVisible];
return
YES;
}
2、FirstViewController.m文件中的写法
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "SingleTon.h"
@interface
FirstViewController ()<SecondDelegate>//AAAA
代理声明可以写这里
@end
@implementation FirstViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor
redColor];
//DDDD
通知中心
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(notify:)
name:@"pp"
object:nil];
//第三个参数:这里专门等着接的通知名
//第一个和第二个参数:截到对应通知名的通知后,用第一个参数去执行第二个参数的方法
// Do any additional setup after loading the view.
}
-(void)notify:(NSNotification*)noti
{
UIColor *color = [noti
object];//发通知的时候传过的参数,就是这里的这个noti,无论什么类型的参数,都用object去解析,解析完了,发的时候是什么类型,就是什么类型
self.view.backgroundColor = color;
}
//touch事件,去第二个页面
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"松手了");
SecondViewController *second = [[SecondViewController
alloc]
init];
second.delegate =
self;//AAAA
被触发者的第二件事儿
[self.navigationController
pushViewController:second animated:YES];
[second release];
}
//AAAA 实现代理的方法
-(void)getColor:(UIColor *)color
{
self.view.backgroundColor = color;
}
-(void)viewWillAppear:(BOOL)animated
{
static int num =
0;
if(num != 0)
{
[self single];
[self userdefaults];
}
num++;
}
-(void)single//BBBB
单例
{
SingleTon *single = [SingleTon
shareInstance];//还是那个
self.view.backgroundColor = single.color;
}
-(void)userdefaults//CCCC
缓存
{
NSArray *colorArr =
@[[UIColor
redColor],[UIColor
yellowColor],[UIColor
blueColor]];//数组存三色
int num = [[[NSUserDefaults
standardUserDefaults] objectForKey:@"color"]
intValue];
self.view.backgroundColor = colorArr[num];
}
3、SecondViewController.h文件中的写法
#import <UIKit/UIKit.h>
AAAA 声明代理
@protocol SecondDelegate <NSObject>
-(void)getColor:(UIColor*)color;
@end
@interface SecondViewController :
UIViewController
@property(nonatomic,assign)id<SecondDelegate>delegate;
@end
4、SecondViewController.m文件中的写法
#import "SecondViewController.h"
#import "SingleTon.h"
@interface
SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor
greenColor];
[self makeBtn];
// Do any additional setup after loading the view.
}
-(void)makeBtn
{
NSArray *arr =
@[@"red",@"yellow",@"blue"];
for(int i =0;i<arr.count;i++)
{
UIButton *btn = [UIButton
buttonWithType:UIButtonTypeRoundedRect];
btn.frame =
CGRectMake(0,
64+i*60, 320,
60);
[btn setTitle:arr[i]
forState:UIControlStateNormal];
[btn addTarget:self
action:@selector(btnDown:)
forControlEvents:UIControlEventTouchUpInside];
[self.view
addSubview:btn];
btn.tag =
1000+i;
}
}
-(void)btnDown:(UIButton*)btn
{
NSArray *colorArr =
@[[UIColor
redColor],[UIColor
yellowColor],[UIColor
blueColor]];//数组存三色
//该传值了
[self delegateMethod:colorArr[btn.tag -
1000]]; AAAA
[self singleMethod:colorArr[btn.tag -
1000]]; BBBB
[self userdefaultsMethod:btn.tag -
1000]; CCCC
[self notificationMethod:colorArr[btn.tag -
1000]]; DDDD
[self.navigationController
popViewControllerAnimated:YES];
}
-(void)delegateMethod:(UIColor*)color//AAAA
代理
{
[self.delegate
getColor:color];
}
-(void)singleMethod:(UIColor*)color//BBBB
单例
{
SingleTon *single = [SingleTon
shareInstance];
single.color = color;//给单例的属性赋值
}
-(void)userdefaultsMethod:(int)color//CCCC
缓存
{
NSUserDefaults *user = [NSUserDefaults
standardUserDefaults];
[user setObject:[NSString
stringWithFormat:@"%d",color]
forKey:@"color"];
[user synchronize];
}
-(void)notificationMethod:(UIColor*)color//DDDD
通知
{
//1、做一个通知中心
NSNotificationCenter *center = [NSNotificationCenter
defaultCenter];
//2、做一个通知内容
NSNotification *notify = [NSNotification
notificationWithName:@"pp"
object:color];//第一个参数:通知名,第二个参数:通知携带的参数
//3、用通知中心把通知内容post出去,然后就不管了
[center postNotification:notify];//中心调方法,内容是参数
}
5、SingleTon.h单例写法 BBBB
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface SingleTon :
NSObject
@property(nonatomic,retain)UIColor *color;//用来保存全局颜色的
+(id)shareInstance;
@end
6、SingleTon.m单例写法 BBBB
#import "SingleTon.h"
static SingleTon *single =
nil;
@implementation SingleTon
+(id)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [SingleTon
alloc];//这里只走一次
});
return single;
}
@end
相关文章推荐
- UI控件笔记(六):UI之UINavigationController、navigationBar和UIView的封装
- UI控件笔记(五):UI之UIViewController和NSUserDefaults
- 详解 C# break ,continue, return
- UI控件笔记(四):UI之UITextField的属性
- KAlertController可更改外观的提示
- UI控件笔记(三):UI之UIButton的属性
- UIPopoverController
- easyui datagrid动态修改editor为combobox的options
- UI控件笔记(二):UI之UILabel和UIImageView
- LeetCode 187. Repeated DNA Sequences
- easyui formatter
- UIKit框架解读
- Jbuilder 代码格式
- android UI——自定义view(layout)重写方法的分析
- easyui清除dategrid所有数据(模拟本地加载)
- iOS开发UI之初识CALayer
- Android SDK requires Android Developer Toolkit version 23.0.0 or above
- UI控件笔记(一):UI之UIView的属性
- 网易视频云:新一代列式存储格式Parquet
- UITextField 的限制输入金额(可为小数的正确金额)