ios项目实用技巧(不断更新)

有时候一点小知识可能要花很多时间才能搞明白,很小的东西就是一直卡在那里,下面介绍一下我在项目中遇到的问题,供大家参考

1.监听UITextField的获得焦点和失去焦点事件

  • addTarget(继承自UIControl)

[self addTarget:self action:@selector(editingDidBegin) forControlEvents:UIControlEventEditingDidBegin];
    [self addTarget:self action:@selector(editingDidEnd) forControlEvents:UIControlEventEditingDidEnd];

UIControlEventEditingDidBegin
1.开始聚焦
2.获得焦点
3.弹出键盘

UIControlEventEditingDidEnd
1.结束编辑
2.失去焦点
3.滚下键盘

  • 代理
  • 通知
  • 利用内部的某些机制

/** 调用时刻:成为第一响应者(开始编辑\弹出键盘\获得焦点) */
- (BOOL)becomeFirstResponder{
    [self setValue:[UIColor whiteColor] forKeyPath:FRPlaceholderColorKeyPath];
    return [super becomeFirstResponder];
}
/** 调用时刻:不做第一响应者(结束编辑\退出键盘\失去焦点) */
- (BOOL)resignFirstResponder{
    [self setValue:[UIColor grayColor] forKeyPath:FRPlaceholderColorKeyPath];
    return [super resignFirstResponder];
}

2.枚举类型遇到<<说明是可以组合使用的,如a = 1 << 0;b = 1 << 1;

3.tableView的间距

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

// 代理方法

4.cell创建的时候没有调用initWithFrame而是调用initWithStyle方法

5.UITableViewCell的使用问题

  • 循环使用
只要有其他的cell设置过imageView.image,其他不需要显示图片的cell都要设置imageView.image = nil,这是防止循环利用时出现bug,即不需要图片的cell也会出现图片

  • 自定义右边箭头图片
// cell右边的箭头
self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

// 自定义图片
self.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow"]];

6.设置图片的拉伸

在右边的Sllcing中的Sllces中选择 水平拉伸 或者 垂直拉伸 或者 水平和垂直 都进行拉伸

7.Cocoapods

  • Podfile.lock文件
    • 描述最后一次更新Pods时,所有第三方框架的版本号
  • 常用指令的区别
    • pod install
      • 根据Podfile文件安装第三方框架
      • 会根据Podfile.lock文件中的版本号来安装第三方框架
      • 如果一开始Podfile.lock文件不存在,就会按照Podfile文件中的版本号来安装第三方框架
    • pod update
      • 根据Podfile文件安装第三方框架
      • 将所有第三方框架更新到最新版本,并且创建一个新的Podfile.lock文件
      • 安装框架之前,默认会执行pod repo update指令
    • pod update --no-repo-update
      • 根据Podfile文件安装第三方框架
      • 安装框架之前,不会执行pod repo update指令

8. 将解析出来的字典弄成plist文件保存在本地

[responseObject writeToFile:@"/Users/free/Desktop/me.plist" atomically:YES];

9.解决tableView设置tableFooterView的contentSize不正确的问题

tableView.tableFooterView = footerView;
// 重新刷新数据(其实也会重新计算contentSize)
[tableView reloadData];

10.沙盒目录路径

NSLog(@"%@",NSHomeDirectory());

11.缓存相关

  • 不能下载东西到Documents,否则苹果不允许上传
  • 一般缓存的东西放在沙盒中Library目录下的Caches文件夹中

12.控制器如果检测到自己的subView中的第一个子View是scrollView,会自动将其Y值设为64,控制器本身的Y值默认是20

13.

// 不允许自动调整scrollView的内边距
self.automaticallyAdjustsScrollViewInsets = NO;

14.穿透效果

以iphone7为例:
在scrollView上添加tableView,
scrollView的高度设置为667,tableview的内边距设置为(64,0,49,0);

15.触发UIScrollViewDelegate的停止滑动方法

/**
    在scrollView滚动动画结束时,就会调用这个方法
    前提:认为拖拽scrollView产生的滚动动画
 */
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    FRLogFunc;
}

/** 
    在动画结束时,就会调用该方法
    前提:当使用setContentOffset:animated:或者scrollRectVisible:animated:方法让scrollView产生了滚动动画 
 */
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
    FRLogFunc;
}

16.viewWithTag实现的大致思路

- (UIView *)viewWithTag:(NSInteger)tag{
    if (self.tag == tag) return self;
    
    for (UIView *subView in self.subViews) {
        return [subView viewWithTag:tag];
    }
}

17.默认情况下,所有控件的tag都是0。

18.一个请求任务被取消了(cancel),会自动调用AFN请求的failure这个block。

19.用AFN请求出错的问题


if (error.code == NSURLErrorCancelled) { // error:取消请求
            // 取消了任务
            FRLog(@"取消了任务");
        }else {
            // 其他错误
            FRLog(@"all请求失败 - %ld",error.code);
        }

        

20.设置tableViewCell之间的间距问题

  • 重写cell的setFrame方法
/** 重写这个方法的目的:能拦截所有设置cell frame的操作 */
- (void)setFrame:(CGRect)frame{
    // 先修改再调用super,这样每个cell的间距都会留下5的间距
    frame.size.height -= 5;
    // 需要改左右边距也可以在这里修改
    frame.origin.x += 5;
    frame.size.width -= 2 * 5;
    [super setFrame:frame];
}

21.自动拉伸问题

  • 从xib中加载进来的控件 autoresizingMask属性默认值是

    • UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
  • 如果一个控件显示出来的大小和当初设置的frame大小不一致,有可能是因为autoresizingMask属性值包含了UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight,解决方案:

self.autoresizingMask = UIViewAutoresizingNone;

22.父类中的某个内容,只允许子类来修改\提供,不能由外界来修改\提供

只提供get方法就行

//如:
- (NSString *)conString;

23.关于readonly属性

// 这个属性会生成count的get方法 和 _type成员变量
@propertr (nonatomic, assign, readonly) NSInteger count;

24.关于ios 10之后访问相册崩溃的问题

在info.plist里面配置下面两个参数就可以了

25.AFN中取消网络请求方法

[manager invalidateSessionCancelingTasks:YES];
// 或者
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];

26.在AFN的网络请求block中使用weakSelf,这是为了防止控制器销毁了但是网络仍在请求数据

__weak typeof(self) weakSelf = self;

27.利用图形上下文做圆形图片(设置太多的layer.cornerRadius会导致应用程序卡顿)

// 开启图形上下文
        UIGraphicsBeginImageContext(image.size);
        
        // 上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        // 添加一个圆
        CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
        CGContextAddEllipseInRect(ctx, rect);
        
        // 裁剪
        CGContextClip(ctx);
        
        // 绘制图片
        [image drawInRect:rect];
        
        // 获得图片
        self.imageListView.image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 关闭图形上下文
        UIGraphicsEndImageContext();

28.对象属性名不能以new开头

29. 判断当前控制器的view是否在window上

// 如果当前控制器的view不在window上,就直接返回
    if (self.view.window == nil) return ;

30.异常的捕获

// 在异常的前面加上这个
@throw [NSException exceptionWithName:@"异常的名字" reason:@"异常的原因" userInfo:nil];

31.添加找不到的头文件

在Build Setting中搜header se,在Header Search Paths中添加$(SRCTOOT)(表示这个项目的路径)

32.根据collectionview的偏移量来判断是左滑还是优化,变大为左滑,变小为右滑

33.测试网络:http://httpbin.org/

34.CGPoint转成NSValue,然后通过NSValue的CGPointValue转回去

35.ios下dyld:Library not load解决方案

一顿搜索之后发现这个问题得产生是因为引用得一些framework只能存在于高版本得sdk中,但是,如果编译到低版本的ios就会发生这样的问题,我的真机是iOS6的版本的,GameController.framework可能高于这个版本,这里只需要在对应的target下的Build Phases标签里,找到Link Binary With Libraries,在里面找到GameController.framework,把status由Required 修改成Optional,然后再运行就OK了。其他的framework报错也适用,只需要修改对应的framework的status就行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容