iOS开发笔记 - 开发中遇到的问题集

显示Mac中隐藏文件

在 Mac 文件的文件名前添加 . 即可使文件隐藏
也可以在终端里面能用命令来控制

显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES

隐藏Mac隐藏文件的命令:bash defaults write com.apple.finder AppleShowAllFiles NO

收起键盘方式

点击return键收起键盘

使用textfield对象的协议方法在点击return的时候进行注销第一响应

1
2
3
4
5
6
- (BOOL)textFieldShouldReturn:(UITextField *)textField{

[textField resignFirstResponder];

return YES;
}

通过手势进行收起

1
2
3
4
5
6
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

[self.view endEditing:YES];
//或者通过对象进行注销第一响应
//[nameTextField resignFirstResponder];
}

oc字面量:@

使非oc的对象存到数组中

1
2
3
4
5
@""		//NSString
@[] //NSArray
@{} //NSDictionary
@3 //NSNumber
@3.14 //NSNumber

KVC使用注意

KVC自动填充模型的属性

1
[self setValuesForKeysWithDictionary:dataDict]

仅仅是上面还不够,因为KVC字典里的属性在模型中必须都有且名字一致,否则可能崩溃
实现方法
setValue:forUndefinedKey:当使用set方法时,碰到模型中没有的key可以容错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

//常见处理json数据中key有id的情况
if ([key isEqualToString:@"id"]) {

_ids = value;
}
}

//同样也有取value时容错
- (id)valueForUndefinedKey:(NSString *)key{

NSLog(@"使用get方法时,没有这个key:%@",key);

return nil;
}

数据持久化

  • 普通文件———-适合任何类型,NSFileManage
  • plist————小型数据
  • NSUserDefault—-小型数据,实际上就是plist
  • 归档Archive——-小型数据,存储对象,NSKeyedArchiver
  • SQLite———–大型数据
  • CoreData———大型数据,系统自带

打印bundle Id

1
2
NSString * bundleId = [[NSBundle mainBundle] bundleIdentifier];
NSLog(@"%@",bundleId);

去除navBar下面的黑线

navgationBar对象方法 setBarStyle:
里面的一个style是UIBarStyleBlackTranslucent

1
[nav.navigationBar setBarStyle:UIBarStyleBlackTranslucent];

使用AFNetWorking2.0以上请求http包头

一帮用于http包头验证信息等,如百度的ApiStore需要apikey在包头请求中验证身份才能进一步请求数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NSString * apiKey = @"d43583ad8477da966df92aa19838e926";
NSString * apiUrl = @"http://apis.baidu.com/showapi_open_bus/channel_news/channel_news";

AFHTTPSessionManager * manager=[AFHTTPSessionManager manager];

manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:apiKey forHTTPHeaderField:@"apikey"];

[manager GET:apiUrl parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {

NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

NSLog(@"%@",dict);

} failure:^(NSURLSessionDataTask *task, NSError *error) {

NSLog(@"%@",error);
}];

nil、Nil、Null、null区别

1
2
3
4
Nil 	//类为空
NULL //指针为空
nil //对象为空,无内存空间
null //值为空,有内存空间

tableView自带的cell分割线从屏幕左端开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//实现下面两个方法改变分割线的偏移量
//设置分割线从顶端开始 适配ios7和ios8
- (void)viewDidLayoutSubviews{

if ([tableView对象 respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView对象 setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
}

if ([tableView对象 respondsToSelector:@selector(setLayoutMargins:)]) {
[tableView对象 setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
}

-(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];
}
}

关闭自动调整scrollView

防止scrollView滚动时抖动

1
self.automaticallyAdjustsScrollViewInsets = NO;

获取当前设备

1
2
3
4
//获取当前设备[UIDevice currentDevice]
if ([UIDevice currentDevice].systemVersion.floatValue >= 7.0) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}

判断定位权限是否被禁用

1
2
3
4
5
6
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"地理位置不可用" message:@"定位功能被关闭,请在[隐私]-[定位]中开启" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去设置", nil];

[alert show];
}

避免UITableView无数据时显示列表的形式

1
_tableView.tableFooterView = [[UIView alloc] init];

计算文本区域的高度和宽度

1
2
3
4
5
6
7
8
9
NSString * str = @"xxxxx";
//设定文本可显示的宽(如我让他距离两侧20)
float strContentWidth = SCREEN_WIDTH-20;
//设定文本可显示的高(一般使用MAXFLOAT最大高度)
float strContentHeight = MAXFLOAT;
//因为字体也会影响字体所占大小
UIFont * strFont = [UIFont systemFontOfSize:12];
//进行计算
CGRect contentRect = [str boundingRectWithSize:CGSizeMake(strContentWidth, strContentHeight) options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:strFont, NSFontAttributeName, nil] context:nil];

这个contentRect即是文本需要的宽和高

cell的高度自适应就可以利用这个来处理

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
属性字典的key和value来设置
NSFontAttributeName 字体
NSForegroundColorAttributeName 文字颜色
NSShadowAttributeName 阴影效果
*/
NSDictionary * attrDict = @{NSForegroundColorAttributeName:[UIColor whiteColor],}

//使用navgationBar对象调用
[nav1.navigationBar setTitleTextAttributes:attrDict];

//或者全局设置
[[UINavigationBar appearance] setTitleTextAttributes:attrDict];

修改状态栏为白色

注意:这是全局设定,一旦设置,进入该界面后,其他界面也会受到影响,需要变色的界面需要再次调用进行修改
先去工程配置(info.plist)中
添加一条记录
key为View controller-based status bar appearance
type为BOOLEAN , value为NO
在需要改变的地方使用[UIApplication sharedApplication]获取单例对象
调用方法
setStatusBarStyle:UIStatusBarStyleLightContent即可

1
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

隐藏状态栏

注意:这是全局设定,一旦设置,进入该界面后,其他界面也会受到影响,需要显示的界面需要再次调用进行修改
同样需要在工程配置(info.plist)中
添加一条记录
keyView controller-based status bar appearance
typeBOOLEANvalueNO
在需要改变的地方使用[UIApplication sharedApplication]获取单例对象
调用方法setStatusBarHidden:YES即可

1
[[UIApplication sharedApplication] setStatusBarHidden:YES];