1筐骇、正向?qū)傩詡髦?/b>
界面 A 跳轉(zhuǎn)到界面 B 的時(shí)夫壁,向界面 B 傳值。
a缺菌、在界面 B 的 .h 文件中聲明一個(gè)屬性
@interface TestViewController:UIViewController
@property (nonatomic,copy) NSString *testStr;
@end
b、在A界面導(dǎo)入界面 B 的頭文件赋续,創(chuàng)建界面 B 并進(jìn)行屬性賦值
TestViewController?*testVC = [[TestViewController alloc] init];
testVC.testStr?= @"test";
[self.navigationController pushViewController:testVC animated:YES];
2男翰、通知傳值
在接收方注冊(cè)通知,并指定接收到通知后進(jìn)行的操作纽乱,并在消毀時(shí)一定要移除注冊(cè)的通知蛾绎,否則會(huì)造成內(nèi)存泄漏;在發(fā)送方傳遞數(shù)據(jù)時(shí)發(fā)送通知鸦列。特別要注意發(fā)送通知時(shí)接收方必須要存在租冠。還要注意發(fā)送方和接受方的通知名稱必須一致。?
a薯嗤、在發(fā)送方中發(fā)布通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"testNotificationName" object:nil userInfo:@{@"color":[UIColor grayColor]];
b顽爹、在接收方中注冊(cè)通知(一般在 viewDidLoad 中注冊(cè)通知)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColor:) name:@"testNotificationName" object:nil];
c、在接收方中實(shí)現(xiàn)通知具體操作
-(void)changeColor:(NSNotification*)noti{
NSDictionary*dict=noti.userInfo;
self.view.backgroundColor=[dict valueForKeyPath:@"color"];
}
d骆姐、在接收方中注銷通知(一般在dealloc中注銷)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"testNotificationName" object:nil];
}
3镜粤、代理傳值
委托者需要做的事:
1、定義協(xié)議與方法
2玻褪、聲明委托變量
3肉渴、利用委托變量來調(diào)用協(xié)議方法
代理需要做的事:
1、遵守委托者定義的協(xié)議带射,把自己賦值給委托者對(duì)象中的delegate
2同规、實(shí)現(xiàn)協(xié)議中的方法
a、在委托者界面.h文件中定義協(xié)議
@protocol TestViewControllerDelegate <NSObject>
- (void)testChangeViewColor:(UIColor *)color;
@end
b、在委托者界面.h文件中定義代理屬性
@property (nonatomic, weak) id<TestViewControllerDelegate>delegate;
c券勺、在委托者界面.m 中需要的位置調(diào)用代理方法
if (_delegate) {
? ? ? ? [_delegate testChangeViewColor:[UIColor redColor]];
}
d绪钥、在代理界面中遵守協(xié)議并設(shè)置成代理者
@interface ViewController ()<TestViewControllerDelegate>
@end
TestViewController *testVC = [[TestViewController alloc] init];
testVC.delegate=self;
[self.navigationController pushViewController:testVC animated:YES];
e、在代理界面中實(shí)現(xiàn)協(xié)議
- (void)testChangeViewColor:(UIColor *)color{
? ? self.view.backgroundColor = color;
}
4关炼、Block傳值
Block就是一段匿名的代碼塊程腹,是具有某種功能的代碼塊。類似代理儒拂,此時(shí)可以不用寫協(xié)議跪楞,相當(dāng)于簡(jiǎn)化的代理方法描述:在子頁面中添加一個(gè)塊語句屬性,在子頁面返回主頁面之前調(diào)用該塊語句侣灶。在主頁面跳轉(zhuǎn)子頁面之前,設(shè)置子頁面中的塊語句屬性將要執(zhí)行的動(dòng)作(回調(diào)函數(shù))缕碎。這樣褥影,在子頁面返回主頁面時(shí)就會(huì)調(diào)用該回調(diào)函數(shù)來傳遞數(shù)據(jù)。
a咏雌、在子頁面.h文件中定義塊語句屬性
@property (nonatomic, copy) void (^testBlock) (void);
b凡怎、在子頁面.m 中文件中需要的位置調(diào)用塊語句
if (_testBlock) {
? ? ? ? _testBlock();
}
c、在主頁面設(shè)置塊語句赊抖,并捕獲傳過來的值
test.testBlock= ^{
};
5统倒、單例傳值
單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例氛雪,這個(gè)類稱為單例類房匆。單例經(jīng)常用來做應(yīng)用程序級(jí)別的共享資源控制。通過一個(gè)單例類报亩,可以實(shí)現(xiàn)不同頁面之間的參數(shù)傳遞浴鸿。單例在編譯時(shí)初始化這個(gè)類,然后一直保存在內(nèi)存中弦追,到程序退出時(shí)由系統(tǒng)自動(dòng)釋放這部分內(nèi)存岳链。
單例的優(yōu)點(diǎn):
1?提供了唯一的實(shí)例,統(tǒng)一管理資源劲件,即提供了對(duì)唯一實(shí)例的受控訪問掸哑。所以很便于外界訪問,存儲(chǔ)狀態(tài)等更加方便零远。
2?只有一個(gè)實(shí)例苗分,可以做到按需創(chuàng)建或加載資源,不用再頻繁地創(chuàng)建和銷毀對(duì)象遍烦,從而提高了系統(tǒng)的性能和節(jié)約系統(tǒng)資源俭嘁。
單例的缺點(diǎn):
1?單例從創(chuàng)建到徹底關(guān)閉程序前都會(huì)一直存在,如果過多的創(chuàng)建單例無疑浪費(fèi)系統(tǒng)資源和影響系統(tǒng)效率服猪。
2供填、由于單利模式中沒有抽象層接口拐云,因此單例類很難再進(jìn)行擴(kuò)展。而且單例不能繼承近她。
+ (instancetype)shareSingleton{
? ? static?SingletonModel*model =nil;
? ? static?dispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? model = [[SingletonModel alloc] init];
? ? });
? ? return?model;
}
? ? ? ? 只要我們保證我們創(chuàng)建這個(gè)單例對(duì)象都是通過shareSingleton方法來創(chuàng)建的就沒問題叉瘩。如果我們不能保證用上面的方法創(chuàng)建對(duì)象,那么就會(huì)出問題粘捎,不能保證這是一個(gè)單例對(duì)象薇缅。
6、KVO傳值
KVO鍵值觀察機(jī)制攒磨,是觀察者設(shè)計(jì)模式的一種實(shí)現(xiàn)泳桦。 當(dāng)觀察者將被觀察者的某個(gè)屬性設(shè)置為觀察的對(duì)象時(shí),若被觀察的該屬性值發(fā)生變化時(shí)娩缰,就會(huì)觸發(fā)觀察者對(duì)象所實(shí)現(xiàn)的KVO接口方法灸撰,從而達(dá)到通知觀察者的目的。
a拼坎、在觀察者中添加觀察
[vc addObserver:self forKeyPath:@"testStr" options:NSKeyValueObservingOptionNew context:nil];
b浮毯、在觀察者中實(shí)現(xiàn)觀察方法
- (void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionaryid> *)changecontext:(void*)context{
? ? NSLog(@"%@",change);
}
c、在被觀察者增加被觀察的屬性
@property (nonatomic, copy) NSString *testStr;
d泰鸡、被觀察者改變?cè)搶傩缘闹?/p>
self.testStr = [NSString stringWithFormat:@"%d",arc4random()%100];
7债蓝、數(shù)據(jù)持久化傳值(緩存?zhèn)髦担?/b>
8、全局變量傳值