题前话
这些天卤煮一直在默默的碼着代码,但是还是感觉距离成功之日还是遥遥无期。没办法啦,今天下午正好后台有一些技术问题需要修改,我这边没有大事情,想了想咱不能在这一下午啥事也不干啊,偷个鸡,摸个狗这种事在我工作地方硬件条件也不允许。最后想了想就给大家喷一碰回传的那些事吧。
回传大家应该经常会使用的吧,啥,你说你没用过,来人呐,把他拉出去砍了......。在刚刚接触ios的时候我也不知道怎么回传,请教得一个通知回传的方法,于是,满篇的通知乱飞。通知不是不好,但是太灵活,不好控制。然后知道了代理回传,块回传的方法,最后自己去选择回传的方案。本篇文档献给那些刚刚跨入ios这一苦逼行业的同学,希望能给你带来一定的帮助(大神就不用看啦,😄😄)。
通知回传
来来来,一起喝通知这杯酒。
首先我定义两个控制器,用于回传测试。ViewController,SecViewController。
在SecViewController定义一个输入框控件,我们把输入的东西回传到第一个控制器:
#import "SecViewController.h"@interface SecViewController ()//输入textfield
@property (weak, nonatomic) IBOutlet UITextField *backField;
@end
然后把输入框输入完成的代理牵出来:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self callBackOne];
}
现在是不是有人在想这个[self callBackOne]是什么鬼,这是调用通知的方法。因为我一会还要写代理,块的回传,你难道想让我再创建两个控制器或者把前面的方法删除在进行相应的测试吗?
发出通知
/**
* 第一种方法:通知回传
*/
-(void)callBackOne
{
NSDictionary *dic = @{@"field":self.backField.text};
[[NSNotificationCenter defaultCenter]postNotificationName:@"callBack"
object:nil
userInfo:dic];
}
在通知这我就不太罗嗦了,不太理解的请看另一篇:通知的那些事。
ViewController控制器创建一个按钮和一个显示回传数据的lable
#import "ViewController.h"#import "SecViewController.h"@interface ViewController ()//点击按钮
- (IBAction)gotoNext;
//显示label
@property (weak, nonatomic) IBOutlet UILabel *dataLabel;
@end
然后接受通知,实现通知方法
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"你瞅啥";
//接收通知
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(notCallBack:)
name:@"callBack"
object:nil];
}
/**
* 通知方法
*
* @param user <#user description#>
*/
-(void)notCallBack:(NSNotification *)user
{
NSString *field = user.userInfo[@"field"];
self.dataLabel.text = field;
}
千万不要忘了不用的时候释放通知:
/**
* 通知一定要释放
*/
-(void)dealloc
{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
好了,到此通知回传结束,很简单的有木有,效果图:
代理回传
来来来,喝完一杯,还有一杯。
通知的最大的缺点也是最大的优点就是太灵活,不好控制。但是相反代理就很稳定,也是团队开发中用得最多的。
首先,创建一个代理:
@protocol SecViewControllerDelegate<NSObject>
//回传
-(void)callBack:(NSString *)field;
@end
@interface SecViewController : UIViewController//代理@property(nonatomic,weak)iddelegate;
@end
和通知一样,在输入框的意境完成输入的方法中调用代理
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self callBackTwo];
}
/**
* 第二种方法:代理
*/
-(void)callBackTwo
{
if ([self.delegate respondsToSelector:@selector(callBack:)]) {
[self.delegate callBack:self.backField.text];
}
}
然后咱们回到第一个控制器,首先挂上的代理
UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecViewController *secVC =[story instantiateViewControllerWithIdentifier:@"Sec"];
//代理方法的实现
secVC.delegate = self;
[self.navigationController pushViewController:secVC animated:YES];
实现代理的方法:
/**
* 代理方法
*
* @param field <#field description#>
*/
-(void)callBack:(NSString *)field
{
self.dataLabel.text = field;
}
运行效果图:
代理结束,我没有说太多,因为感觉你们看这一块,比我在这说要好得多,我会把demo链接给出,你们可以自己运行看看,会更好(如果有github账号的,可以来个星星的呀,😄😄)。
Block回传
来来来,还有最后一杯。
首先在第二个控制器定义一个块:
//块
@property(nonatomic,copy)void(^callBackBlock)(NSString *field);
然后喝前面两个一样,在输入框完成输入时调用:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self callBackThree];
}
/**
* 第三种方法:块(Block)
*/
-(void)callBackThree
{
self.callBackBlock(self.backField.text);
}
然后咱们回到第一个控制器,实现块的方法:
UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecViewController *secVC =[story instantiateViewControllerWithIdentifier:@"Sec"];
//代理方法的实现
//secVC.delegate = self;
//块方法
__weak typeof(self)weakSelf = self;
secVC.callBackBlock = ^(NSString *field)
{
weakSelf.dataLabel.text = field;
};
[self.navigationController pushViewController:secVC animated:YES];
运行效果图:
嘎嘎嘎,终于结束了。废话不多说,因为后台让我工作了。呜呜呜......。
github地址:https://github.com/sunyunfei/CallbackDemo.git
结语
我也看到了有的同学让写一篇block的知识点,我也正在努力,可是我也不可能直接百度了一点东西直接给大家。我写的必须是我自己理解的才行,不然怎么可能给大家说透彻。所以,block会有,请大家理解。
网友评论