oc中反向傳值四種方法
block反向傳值
在需要傳值的界面:
//在傳值界面聲明一個block屬性
//用typedef重新定義block類型
typedef void(^sendBack) (NSString*);
@interface SecondViewController : UIViewController
//用新定義的block類型聲明一個屬性
@property (nonatomic,copy) sendBack block;
@end
//實現(xiàn)文件中
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
//需要穿的值
_str = @"反向傳值";
//傳值按鈕
UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
[button setTitle:@"back" forState:UIControlStateNormal];
[self.view addSubview:button];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchDown];
}
- (void)back{
//調用block屬性給并給出要傳的參數(shù)
_block(_str);
[self dismissViewControllerAnimated:true completion:nil];
}
在接受到傳值的界面
//推出下一個界面的方法中
- (void) push{
SecondViewController * secondVC = [[SecondViewController alloc] init];
//調用它的block屬性
secondVC.block = ^(NSString * str) {
//把傳過來的參數(shù)賦給自己的屬性
_str = str;
};
[self presentViewController:secondVC animated:true completion:nil];
}
單例反向傳值
創(chuàng)建一個單例類
@interface SCffDefault : NSObject
//聲明需要傳值的屬性
@property (nonatomic, assign) NSString *str;
//聲明一個外界唯一實例化的方法
+(instancetype)initDefault;
@end
@implementation SCffDefault
//廢掉原來默認的初始化方法讓它拋出異常
-(instancetype)init {
@throw [NSException exceptionWithName:@"SCffDefaultException" reason:@"不能用init方法創(chuàng)建對象" userInfo:nil];
}
//寫一個私有的初始化方法
- (instancetype)initPrivate{
if (self = [super init]) {
}
return self;
}
//實現(xiàn)向外界提供的實例化類方法
+ (instancetype)initDefault {
static SCffDefault * instance = nil;
//使用dispatch_once保證只有一個現(xiàn)場執(zhí)行此段代碼急鳄,保證代碼唯一性
//此處頁可以用@synchronized(self){}來保證單一線程,但沒有dispatch_cnce函數(shù)好
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!instance) {
instance = [[self alloc] initPrivate];
}
});
return instance;
}
@end
在需要傳值的界面
- (void)back{
//創(chuàng)建單例對象給屬性賦值
[SCffDefault initDefault].str = _str;
[self dismissViewControllerAnimated:true completion:nil];
}
在接受到到傳值的界面
//用單例對象給自己需要賦值的屬性賦值
_str = [SCffDefault initDefault].str;
消息中心反向傳值
在需要傳值的界面
- (void)back{
//創(chuàng)建消息中心單例并發(fā)送消息
[[NSNotificationCenter defaultCenter] postNotificationName:@"sendData" object:_str];
[self dismissViewControllerAnimated:true completion:nil];
}
在接受到傳值的界面
//注冊成為觀察者并實現(xiàn)方法
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(assigementWithNotif:) name:@"sendData" object:nil];
-(void)assigementWithNotif: (NSNotification *)notif{
//給屬性賦上傳過來的值
NSString * str = notif.object;
_str = str;
}
//最后在dealloc方法中移除觀察者
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
使用協(xié)議以委托的方式進行傳值
在需要傳值的界面
//定制傳值協(xié)議
@protocol sendDataDelegate <NSObject>
-(void) fillwithStr: (NSString *)str;
@end
@interface SecondViewController : UIViewController
//聲明代理屬性
@property (nonatomic, weak) id<sendDataDelegate> delegate;
@end
//在適當?shù)臅r機調用協(xié)議里面的方法
- (void)back{
//用代理屬性調用協(xié)議方法
[_delegate fillwithStr:_str];
[self dismissViewControllerAnimated:true completion:nil];
}
在接受到傳值的界面
//在push出下個界面的方法中把自己設置成代理對象
- (void) push{
SecondViewController * secondVC = [[SecondViewController alloc] init];
//把下個界面的代理設置為自己
secondVC.delegate = self;
[self presentViewController:secondVC animated:true completion:nil];
}
//遵循協(xié)議
@interface FirstViewController ()<sendDataDelegate>
//實現(xiàn)協(xié)議中的方法
- (void)fillwithStr:(NSString *)str{
_str = str;
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者