传值,什么样的值才叫值?我开始始终认为传值值得就是将一个页面textflied的text传到另外一个页面,那叫传值,哎,太年轻啊,最近各种传值,说说薄弱的一点点经验吧,我觉得最好用的还属block吧,个人比较喜欢,协议也不错,协议和block用法挺像的而且比block麻烦,就不写啦,通知一对多,比如在软件中想写个设置背景图片什么的简直是利器,至于单例也有传值的功能,共享单例,在用FMDB数据库时也是很好用滴,剩下的传值好像还有个正向传值,也就是变量传值,那个很简单就不写了,好吧,我承认我写的都很简单,欢迎大能补充
FMDB,共享单例
+ (instancetype)sharedInstance{
static TimeTableDBmanager *s_dbManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
s_dbManager = [[TimeTableDBmanager alloc]init];
});
return s_dbManager;
}
通知传值设置所有页面的背景图片
将一张图片直接转为NSData,然后,好吧,将就存在NSUserDefaut里面吧,因为要实现数据持久化,不然下次进来就没了
- (void)notifacation:(UIImage *)image{
NSData *imageData = UIImagePNGRepresentation(image);
[[NSUserDefaults standardUserDefaults] setObject:imageData forKey:@"image"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:image,@"picname", nil];
NSNotification *notifaction = [NSNotification notificationWithName:@"tongzhi" object:nil userInfo:dic];
[[NSNotificationCenter defaultCenter]postNotification:notifaction];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
self.BackgroundImageView.image = image;
}
//将以下代码封装起来就可以在各个页面设置背景图片啦,好吧,是不是有点low啊
NSData *imageData;
imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"image"];
//UIImage *image = [NSKeyedUnarchiver unarchiveObjectWithData:imageData];
UIImage *image = [UIImage imageWithData:imageData];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[self.BackgroundView setImage:[image applyBlurWithRadius:10 tintColor:[UIColor colorWithWhite:1 alpha:0.5] saturationDeltaFactor:1.8 maskImage:nil]];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notifacation:) name:@"tongzhi" object:nil];
- (void)notifacation:(NSNotification *)text{
UIImage *picname = text.userInfo[@"picname"];
picname = [picname imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[self.BackgroundView setImage:[picname applyBlurWithRadius:10 tintColor:[UIColor colorWithWhite:1 alpha:0.5] saturationDeltaFactor:1.8 maskImage:nil]];
}
block块不止可以传值,他貌似可以传任何想传的东西,最好用的莫过于,只有触发时才回到赋值的地方执行代码了,而且其中一个特性也是很强大,捕获外部变量,有时候可以直接把传值都省了,如果有大量数据要创建,不想在页面出现时就创建,那就在点击时给block块传值创建,那样代码会很漂亮,好吧,表达不清直接上代码,当然这是才开始接触时写的一个Demo了
//点击
- (void)addTapGestureRecognizer{
self.userInteractionEnabled = YES;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handletap:)];
[self addGestureRecognizer:tap];
}
- (void)handletap:(UITapGestureRecognizer *)tapGesture{
if (self.clickAction) {
self.clickAction(self);
}
}
#import "ViewController.h"
#import "ClickUIimageView.h"
#import "DetalViewController.h"
#define IMAGE_PADDING 5
#define CONTENT_VIEW_W (375-5*IMAGE_PADDING)/4
#define CONTENT_VIEW_H CONTENT_VIEW_W*5.0/3
@interface ViewController ()
{
UIScrollView *_scrollView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
//注意:由于坐标是从导航栏下开始,所以scrollview的高度667-64
_scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,603)];
//
// UIImageView *imageview = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"2_1.jpg"]];
//
// imageview.frame = self.view.bounds;
// [_scrollView addSubview:imageview];
self.navigationController.navigationBar.translucent = NO;
//当 Scrollview 和 navigationController 一起使用时,默认情况下UINavigationController会对UIScrollView的内边距距离进行调整,目的是防止UIscrollView的内容被覆盖
//凡是从UIScrollView继承的子类都有这个问题
//通过下面这句话可以消除这种默认调整
self.automaticallyAdjustsScrollViewInsets = NO;
NSString *plistFile = [[NSBundle mainBundle]pathForResource:@"AlbumData" ofType:@"plist"];
NSArray *ablumArray = [NSArray arrayWithContentsOfFile:plistFile];
for (int i = 0; i < ablumArray.count; i++) {
NSDictionary *dic = [ablumArray objectAtIndex:i];
NSString *imageName = [NSString stringWithFormat:@"%@.jpg",dic[@"NAME"]];
ClickUIimageView *imageView1 = [[ClickUIimageView alloc]initWithImage:[UIImage imageNamed:imageName] title:dic[@"TITLE"] ClickAction:^(ClickUIimageView *imageView) {
//点击之后处理的代码
DetalViewController *detailViewController = [[DetalViewController alloc]init];
detailViewController.imageTitle = dic[@"TITLE"];
detailViewController.imageName = [NSString stringWithFormat:@"%@.jpg",dic[@"NAME"]];
//detailViewController.index = i;
detailViewController.completeBlock = ^(NSString *title){
[imageView updateTitle:title];
};
[self.navigationController pushViewController:detailViewController animated:YES];
}];
imageView1.frame = CGRectMake(IMAGE_PADDING+(CONTENT_VIEW_W+IMAGE_PADDING)*(i%4), IMAGE_PADDING+(CONTENT_VIEW_H+IMAGE_PADDING)*(i/4), CONTENT_VIEW_W, CONTENT_VIEW_H);
//找到最后一个imageView
if (i == ablumArray.count-1) {
_scrollView.contentSize = CGSizeMake(_scrollView.bounds.size.width,CGRectGetMaxY(imageView1.frame)+40);
}
[_scrollView addSubview:imageView1];
}
[self.view addSubview:_scrollView];
}