iOS 开发中你是否遇到这些经验问题(一) - CocoaChina_让移动开发更简单
iOS 8个实用小技巧(总有你不知道的和你会用到的)
1.switch 中的case要用大括号括起来
2.在Objective-C中向nil发送消息是安全的
3.自定义单元格时,经常将控件家在contentview上。如果在防止重用,移除子视图时,将cell.contentview.subviews写成了cell.subviews
4.懒加载中将if (!_xxxx)中的_删掉了
5.懒加载中的self.xxx 和_xxx的区别。(一个是get方法 一个是实例变量 , 懒加载中一定要调get方法)
6.控件初始化添加后再视图上不可见(80%是frame某一个值设置的有问题)
7.自己添加.pch文件步骤
a:创建文件(xxxxxxxx)(最好创建在跟项目名同名的文件夹中,即创建前点击下那个文件夹下的一个区域)
b:在target的build phase中search language 会看到APPLE LLVM 7.1 language
在这个目录下会有Precompile Prefix Header 将其设置为yes
c:在Prefix Header 中添加自己的.pch文件的路径 其中$(SRCROOT)代表项目的路径 在这之后拼接项目内路径
8.a:(iOS9 及以下)允许http协议的借口的设置在项目的.plist文件中添加App Transport Security Setting(ATS) ,在它的子目录下添加 Allow Arbitrary Loads 并设置为yes。
b:iOS10中,无法设置Allow Arbitrary Loads ,解决方案如下。
1)、在项目的info.plist中添加一个Key:App Transport Security Settings,类型为字典类型。
2)、然后给它添加一个Exception Domains,类型为字典类型;
3)、把需要的支持的域添加給Exception Domains。其中域作为Key,类型为字典类型。
4)、每个域下面需要设置3个属性:NSIncludesSubdomains(yes)、NSExceptionRequiresForwardSecrecy(no)、NSExceptionAllowsInsecureHTTPLoads(yes)。
9.删除项目的资源文件时,要在项目中删除(不能在show in finder中删除),会导致警告。
10.imageNamed方法初始化的image实例,如果name的图片不存在,初始化的值为nil。
11.向数组中插入nil会崩。
12.关于collectionviewflowlayout类的布局思路之一:
a:声明一个数组属性,用于承装所有的布局属性
b:在prepare方法中创建所有cell的index path并调用layoutforindexpath方法,为每一个相应的layoutattr设置相应的值,
c:在layoutforrect方法中,返回这个数组。
13.待解决:对于collection view来说,每一个cell是如何完成初始化的。
答:在cellforindexpath方法中,忘记了if(!cell){初始化cell的代码},
14.UISearchBar继承于UIView,与tableview相似的用法。通过代理实现回调的一些处理。
15.在自定义的tableviewcell中,它的frame的值仍然是默认的值(44),需要在设置他的字视图之前,将它的值改成需要的值的大小。
16.防止tableview重用时,将content view的字视图移除后,设置好cell的字视图的属性后,要将这些子视图重新添加到cell.contentView上。
17.button的内部其实挺复杂的。(继承于UIControl)
其中imageedgeinset的属性是对于image属性。对image view,back image 没有效果。
18.在block中修改局部变量的值,需要用__block进行修饰。用到self时,要用__weak进行修饰。
19.-drawrect方法不要用。
20.只读属性的值如何更改?(需要使用运行时的东西,具体做法不详)
21.开发过程中,常用的代码要形成代码块。增加效率。
22.永远是眼高手低
23.先创建layout类,在写collection view。collectionview初始化的时候一定记得注册单元格。会崩。
24.定义全局的静态变量写在@implementation后
25.在一个控制器中,表的作用仅仅是显示数据停留在界面层的作用。不应该通过表的属性获取一些信息值。信息值应该存在于有关的datamodel类中,专门做信息的传递。通过cellforindexpath方法获取的cell,如果这个cell不再屏幕范围内,会返回为nil。
26.array初始化后添加的字符串做的是值的拷贝。例如数组添加了一个变量,然后在改变着歌变量的值,数组中的值不会随之改变。因为是做的值的拷贝。
27.刚刚编译时突然报红No such file or directory: '/Users...,在项目里搜对应文件发现它就静静的在那,没有任何异常,解决方法:删掉TARGETS - Build Phases - Compile Sources 里白框的文件
28.appdelegate 的类目的使用。对于delegate可以使用category的方式对其进行分类。更加清晰。
app delegate 的分类处理
29.对于iOS7以及更新版本 ,textview 输入时上下跳动的bug。iOS7以后UITextView 技巧 - 奋进的闹钟 - 博客园
坑1:
iOS7及以上的版本上,UITextView出现这样的问题:弹出键盘时,没输入任何文字,但是光标位置不是在最上方。
解决方案: iOS7以后新增了一个属性automaticallyAdjustsScrollViewInsets,将其置为NO即可。别忘了加版本判断。
if (IOS7_And_Later) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
坑2:
iOS7及以上的版本上,UITextView输入中文时,在输入多行后,光标有时会上下跳动,输入文字的时候内容有时会往上跳,光标都显示不出来。这个bug坑死好多人啊,特别是做聊天输入框的时候,不得已找一些非正常的方法解决。从网上找的各种解决方案都不行。
复制代码
- (void)textViewDidChangeSelection:(UITextView *)textView
{
//fix ios7 bug (modified by 老岳).
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
CGRect r = [textView caretRectForPosition:textView.selectedTextRange.end];
CGFloat caretY = MAX(r.origin.y - textView.frame.size.height + r.size.height + 8, 0);
if (textView.contentOffset.y < caretY && r.origin.y != INFINITY) {
textView.contentOffset = CGPointMake(0, caretY);
}
}
}
30.检查IDFA的方法:
步骤:
1、打开终端cd到要检查的文件的根目录。
2、执行下列语句:grep -r advertisingIdentifier . (别少了最后那个点号)。
31.aruchive项目时,弹出Not a PNG filCommand copypng emitted errors but did not return a nonzero exit code to indicate failure。项目图片问题。
可能的原因a:项目中有图片不是png图片,将图片格式华为png格式。
b:Two targets were added for same image. Goto project target ->Build Phases -> Copy Bundle Resources and search for your image file name.
32.UIScrollView 的几种属性的含义。(很低级,但是,知之为知之,不知为不知,是知也。没那么简单)
contentSize :(CGSize)视图内容大小。展示的主要区域
contentInset:(UIEdgeInset)视图缩进的数量
contentOffset:(CGPoint)视图偏移量(他的值是视图内容的坐上角和scrollView的左上角的差值(用小demo测试过),初始化后暂时为(0,0))
最后,scrollview滚动区域大小是 contentSize contentInset 的总和。
33.项目刚被创建后的suprooting Files的无力文件夹式不存在的。因此在写pch文件的路径时候要注意。
34.将文件夹拖入项目中时要勾选项目意义
a:group b:Folder reference
1. Group 分组(黄色)
在xCode的工程中,右键New Group, 即可创建,也就是黄色的文件夹。
工程中想要分类管理的文件,可以分门别类的放在不同的group里面
group本身不影响文件的物理存放,也就是实际存放位置,只是在Project文件中
2.Folder reference(蓝色)
在管理大量资源文件时候,利用foler reference可方便和实际文件夹构造保持一致.
tips:Folder reference 形势拖入时,文件夹下的文件路径又可能找不到,在build setting 的搜索 search path 将 header search path 中添加某一特定的文件路径即可。例如:$(SRCROOT)/testOne/Category
35.经常遇到xcode8打不开项目的问题。(打不开特定项目,或打开项目无响应)
电脑上安装了其他版本的xcode(我安装了Xcode7.3),卸载其他版本的Xcode后,可以正常打开。
36.uiwebview (继承于UIView) 没有bounce属性。设置不滑动代码为 [(UIScrollView *)[[webView subviews] objectAtIndex:0] setBounces:NO];
37.webview 加载本地html5文件urlstring 需要拼接路径。
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"xxx/xxx/xx.html" relativeToURL:[[NSBundle mainBundle] bundleURL]]]];
38.学校是可以申请公司级别的开发者账号的。
公司和教育机构必须提供为其法人实体注册的 D-U-N-S Number;而对于政府组织,D-U-N-S Number 则是可选信息。如果您以个人身份注册,则无需 D-U-N-S Number。
39.CADispalyLink 的区别 NSTimer
最主要的是刷新的频率不同。前者和页面刷新的频率相同(每秒60次)。后者可以自定义刷新间隔。
因此前者适合对页面做实时的更新。后者是可循环处理相同任务及其他场景。
40.对mask(遮罩)的理解(果然还是看图说话什么的管用)
遮罩的理解