過程:有A和B控制器井辜,A先跳轉(zhuǎn)到B著摔,然后B傳值給A雪位。
一、Block
1.首先在B控制器的.h文件中定義一個沒有返回值梨撞,參數(shù)類型為NSString的block屬性雹洗。
@property (copy, nonatomic)void(^block)(NSString *str);
2.在A控制器中,給B控制器的block屬性進行賦值卧波。
//A跳轉(zhuǎn)B
- (void)push{
BViewController *vc = [[BViewController alloc]init];
vc.block = ^void(NSString *str){
//這里就可以拿到B控制器傳遞過來的值
NSLog(@"%@",str);
};
[self.navigationController pushViewController:vc animated:true];
}
3.在B控制器回跳到A的方法中調(diào)用block时肿,調(diào)用block之前最好先判斷block是否為空,不為空才調(diào)用港粱,否則程序崩潰螃成。
//B回跳A
- (void)pop{
//裝逼寫法
//!self.block? : self.block(@"回調(diào)");
//一般寫法
if (self.block) {
self.block(@"回調(diào)");
}
[self.navigationController popViewControllerAnimated:YES];
}
二、Delegate
1.首先在B的.h文件中聲明協(xié)議和協(xié)議方法查坪。
@protocol BViewControllerDelegate <NSObject>
- (void)myDelegate:(NSString *)str;
@end
2.在B的.h中聲明一個協(xié)議屬性寸宏,這里要注意用assign或weak修飾,
weak和assign是一種“非擁有關(guān)系”的指針偿曙,通過這兩種修飾符修飾的指針變量氮凝,都不會改變被引用對象的引用計數(shù)。但是在一個對象被釋放后望忆,weak會自動將指針指向nil罩阵,而assign則不會竿秆。所以,似乎用weak更安全些稿壁。
@property (assign,nonatomic)id<BViewControllerDelegate>delegate;
3.在A的.m中幽钢,導(dǎo)入B控制器,實現(xiàn)B里的delegate傅是,并實現(xiàn)delegate的方法匪燕。
#import "BViewController.h"
@interface AViewController ()<BViewControllerDelegate>
@end
//BViewControllerDelegate的方法
- (void)myDelegate:(NSString *)str{
//在這里拿到B傳過來的值
NSLog(@"%@",str);
}
4.在A的.m中,在push到B界面的push方法之前喧笔,B對象的初始化之后谎懦,指定A對象為B對象的代理。
//A跳轉(zhuǎn)B
- (void)push{
BViewController *vc = [[BViewController alloc]init];
vc.delegate = self;
[self.navigationController pushViewController:vc animated:true];
}
5.在B的.m中溃斋,在pop方法里界拦,判斷在指定的代理類中是否實現(xiàn)了該協(xié)議方法,[self.delegate 協(xié)議方法名稱:(參數(shù)梗劫,也就是要傳回的數(shù)據(jù)) ]享甸,確保執(zhí)行時無此方法時不崩潰 。
//B回跳A
- (void)pop{
//裝逼寫法
// ![self.delegate respondsToSelector:@selector(myDelegate:)]? : [self.delegate myDelegate:@"回調(diào)"];
//一般寫法
if ([self.delegate respondsToSelector:@selector(myDelegate:)]) {
[self.delegate myDelegate:@"回調(diào)"];
}
[self.navigationController popViewControllerAnimated:YES];
}