第一种,当你用数据库存储数据的时候,你会慢慢发现如果把所有要用的字段都用字符串类型来写成属性,类对象属性少的时候方便,例如:
但是如果一个类有七八十个需要单独用到的字段,你还是用全部一一写成属性的话,那就太浪费人力物力了。这个时候,我们通常先想到的是把网络请求获取到的数据用一个数组或者字典来存储,这样就好用多了;But ------you know ! 数据库只能存储一般数据类型,数组、字典这类型的数据类型他是不能进行存储的。所以此时我们就需要把json类型的数据转化成为字典,这样使用起来就更加的方便了,当然在存储的时候你还是要把他转化为字符串类型以后再进行存储,同样的道理,把要使用的数据在类中以数组类型写出来,把字符串转化为数组,使用完成之后,再把数组的数据转化为字符串类型,这样也就更加方便存储了。
这里我就把字符串和字典的相互转换,数组和字符串的相互转换方式写出来,供大家参考,如果有什么不足,请海涵。
json数据类型转字典格式:
+(NSDictionary *)transformDictionaryWithJsonString:(NSString *)jsonString{
if (jsonString == nil) {
return nil;
}else{
NSData *jsData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsData options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"json解析失败:%@",error);
return nil;
}
return dic;
}
}
字典格式转化为json数据类型:
+(NSString *)transformJsonStringWithDictionary:(NSDictionary *)dictionary{
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString =[[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
return jsonString;
}
把数组数据类型转化为字符串类型:
+(NSString *)transformStringWithArray:(NSArray *)array{
NSString *resutString = [array componentsJoinedByString:@","];
return resutString;
}
字符串数据类型转化为数组:
+(NSArray *)transformArrayWithString:(NSString *)string{
NSArray *resutArray = [string componentsSeparatedByString:@","];
return resutArray;
}
第二种,在开发的过程中,有些时候某些类文件在每一个控制器中都有可能会用到,那么这个类最好就放到PrefixHeader.pch文件中,这样的话就不用在每个控制器中添加对应的头文件。那么具体操作步骤如下:
1.创建一个Pch文件,然后点击Pch文件,找到右边关于Pch文件的路径,然后复制它的路径的后两个斜杠之间的内容(注:记得两个反斜杠都不能丢掉)。
2.打开左边项目设置的地方点击中间的Build Settings 然后再搜索栏里面输入prefix
3.到下面搜索出来的结果里面去查找带有prefix Header的选项,然后点击那一行的后面,这时会出现一个弹出框
4.最后再弹出框里面输入$(SRCROOT)+你之前复制的Pch文件的最后两个斜杠之前的内容,然后回车,你再把头文件或者宏定义放到Pch文件中,就可以在真个项目的任何一个地方引用了。
第三种,UIImage图片的Base64编码方式:
- (NSString *)imageBase64Description:(UIImage *)image
{
NSData * data = UIImageJPEGRepresentation(image, 0.2);
NSString * encode = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
return encode;
}
第四种,通过label中文字所占宽度来设置label的大小:
NSString *string = @"从前有座山,山上有座庙,庙里有个和尚!";
CGSize size;
CGRect rect = [string boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:font]} context:nil];
size = rect.size;
return size;
这里返回的就是文字的size,然后就可以通过文字的size去设置label的大小了,但是在cell中,如果我们要用文字去设置label的大小,而又要求label是动态输入的话,就不行;因为对于tableview来说,它是先走的自定义cell里面的内容,然后再走tableview那个类的内容,所以在算文字的size的时候,此时文字为空,算出来的size也是空,此时如果你是用Masonry去适配cell的话就好了,只需要一句话就搞定:make.width.greaterThanOrEqualTo(@1); make.height.greaterThanOrEqualTo(@1);Masonry会自动去帮我们算label的大小,根本不用我们再去操心。此时,我们就可以做一个安静的美男子了。
第五种,平时我们在开发的过程中,有些时候要求我们在cell的右边添加一个小箭头,或者是添加一个button,有相当一部分人第一想法就是自定义一个箭头或者button放到cell上面去,但其实苹果系统是自带的有这些样式的,我们只需要调用cell的accessoryType属性就能找到cell的四种系统样式。
cell.accessoryType = UITableViewCellAccessoryNone;//cell没有任何的样式
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//cell的右边有一个小箭头,距离右边有十几像素;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;//cell右边有一个蓝色的圆形button;
cell.accessoryType = UITableViewCellAccessoryCheckmark;//cell右边的形状是对号;
根据你的需要,在这四种样式中选择你需要的就好了,当然,你如果不嫌麻烦,也可以自定义。
第六种,当我们在加载webview获取做网络请求的时候,如果我们没有一个显示加载进度的,可能因为网络很卡的原因,程序卡在那里很久都没有反应,用户此时从直观上看,不会认为是网络不好的原因,他们大多会认为这是开发者遗留的一个程序漏洞。为了清楚的了解到当前网络请求进行的如何,我们可以通过获取AFNetworking网络请求的返回值loadprogress来查看网络请求进度,我们也可以加一个第三方控件MBProgressHUD来显示网络请求的进程,具体的操作流程如下:
先用cocoaPods导入MBProgressHUD的框架,然后
#import "ViewController.h"
#import<AFHTTPRequestOperationManager.h>
#import<MBProgressHUD.h>
@interface ViewController (){
BOOL _adjust;
}
-(void)initializeAppearance; //初始化用户界面
@property(nonatomic,strong)MBProgressHUD *HUD;
@property(nonatomic,strong)UILabel *displayLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initializeAppearance];
}
-(void)initializeAppearance{
_adjust = NO;
self.view.backgroundColor = [UIColor whiteColor];
self.displayLabel = [[UILabel alloc]initWithFrame:CGRectMake(80, 200, 200, 80)];
_displayLabel.layer.cornerRadius = 5;
_displayLabel.layer.masksToBounds = YES;
[self.view addSubview:self.displayLabel];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(80, 500, 80, 80);
button.backgroundColor = [UIColor blueColor];
[button setTitle:@"时间" forState:UIControlStateNormal];
[button addTarget:self action:@selector(respondsTobutton:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)respondsTobutton:(UIButton *)sender{
self.HUD = [[MBProgressHUD alloc]initWithView:self.view];
[self.view addSubview:self.HUD];
_HUD.dimBackground = YES;
_HUD.labelText = @"正在加载";
_HUD.detailsLabelText = @"加载中,请稍等....";
_HUD.mode = MBProgressHUDModeDeterminate;
[_HUD showAnimated:YES whileExecutingBlock:^{
float progress = 0.0f;
while (progress < 1.0f) {
progress += 0.01f;
_HUD.progress = progress;
usleep(50000);
}
} completionBlock:^{
_adjust = !_adjust;
_adjust == (YES) ? (_displayLabel.textColor = [UIColor redColor]) : (_displayLabel.textColor = [UIColor blueColor]);
_displayLabel.text = @"你成功了,hahaha";
[_HUD removeFromSuperview];
_HUD = nil;
}];
效果图:
第七种,在给自定义cell做屏幕适配的一些小技巧;因为cell在被加载到tableview上面之前他是给了一个默认的宽度(320)和高度(44)的,然后当你的视图控制器在加载tableView的时候,cell的默认宽高才会被改变。那么我们在自定义cell里面要加入控件做适配,那一定就得那个被适配后的cell的宽度和高度来作为相对位置,这个时候如果去拿cell的superview他是一个空对象,如果取contentview他此时的宽度是默认的320,因此更好的办法是在 当前类中宏定义来获取屏幕的宽度和高度来做适配,这样就把问题迎刃而解了。具体方法如下:
#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width //获取设备屏幕的宽度
#define SCREENHEIGHT UIScreen mainScreen].bounds.size.height //获取设备屏幕的高度
第八种,修改导航栏的标题颜色和字体大小,这个装逼小技巧大家应该都知道,这里就不再赘述,直接上代码:
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont systemFontOfSize:16]};
第九种,在iOS7中,UITableViewCell左侧会有默认15像素的空白。设置setSeparatorInset:UIEdgeInsetsZero 能将空白去掉。但是在iOS8中,setSeparatorInset:UIEdgeInsetsZero 的设置已经不起作用了。下面是解决办法:
首先在viewDidLoad方法加入以下代码:
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
然后在UITableView的代理方法中加入以下代码
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
{
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
tableView的显示动画
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPat{
cell.alpha = 0;
cell.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.8, 0.8);
[UIView animateWithDuration:0.8 animations:^{
cell.alpha = 1;
cell.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
}];
}