IOS 开发基础:UIView

控件就是视图,视图就是控件,控件本质是 uivew 类或者子类,视图就是能看的见的东西。



 uiview

uiview 是一种类,所有可以在屏幕上看的见的东西都是 UIview 的对象,uiview 的类有自己的属性,包括高度,宽度,title 名,等等,通过 API 可以查看有什么属性。

每一个 uiview 对象都是一种容器,记住的每一个,容器说明可以容纳其他的对象,包括 uiview 对象.比如每一次的页面切换都是一个新的 uiview,每个页面中又有许多小的 uivew,也就是满屏的 uiview 中有小的 uiview,如果是兄弟 uiview 的话是有顺序的,最后的会遮挡住之前的 uiview,如果没有设置透明的话,透明属性 opaque(透明)。


uivewcontroller:

uiviewcontroller 也是一个类,它的实例对象用于控制 uiview,每一个满屏的 uivew 都会交给 uivewcontroller 管理,满屏 uivew 就是一整个页面不同的 uiview 交给不同的 uivewcontroller 去管理,uivew 有多个,uiviewchontroller 也有多个,并且 uiviewcontroller 负责监听屏幕是否被点击,每次点击都会创建一个新的 uiview 和 uiviewcontroller,当点击返回后,这个uiview 和 uiviewcontroller 也会被销毁,uiviewcontroller 就是用来控制 uiview 的实例对象的,controller 负责控制 uiview 对象的创建和销毁,还有显示和隐藏 view,并且处理 view 对象和用户的交互。


程序运行的过程:

程序启动首先加载 mainstroyboard,然后初始化剪头所指向的控制器(只初始化一个界面,其他界面只有在载入的时候才会初始化),控制器可以自定义,之后创建控制器内部的 view,并且将 view 显示在屏幕上.


frame:

cgrect,在框架中,x和 y 的是以父类uiview 对象为基准的,不是以满屏为基准的,要分清楚是父子类关系还是兄弟类关系,在左边列表中可以很方便的查看,

center:

center 属性和 frame 属性类似,center 属性只对应坐标位置,即中心点的 xy 的值,frame 即有坐标属性也有 size 属性,可以改坐标和改大小,center 只能改坐标。 center 是一个 point 的属性,只有 xy 的值

bounds:

cgrect,以自己本身的左上角为原点,而 frame 以父类的左上角为原点,改 bouns 不能改坐标,只能是改大小,因为它永远是以左上角为原点的,通常使用满屏的 bounds 来获得对应型号的手机的屏幕尺寸大小,self。view。bounds 就是满屏大小。

center:

cgpoint,中点,要区分清楚哪里是原点就可以正确定义中点了,即中点是一个坐标,这个坐标以什么为参照系,frame 的中点和 bounds 的中点是不同的,因为参照系的不同

tag:

多个按钮发送同一种消息时,可以知道是点击了哪个按钮,读取 tag 属性就行,默认 tag 是0,可以自己定义数字,但是 tag 不是唯一的,不同按钮可以定义同一个 tag 值。其实还可以把按钮这个对象的所有信息打印出来,tag 只能是纯数字,tag 的数字范围很大

superview,subview

可以查看当前 view 的父类和子类分别有哪些,子类还有一个 count 属性提供子类对象的个数,但是父类只有1个,所以没有 count 属性。subview 是一个数组,不是 set,因为 view 是有顺序的。

transform:

改变形状,任何 uiview 都有这个属性,可以通过这个来改变 uiview 的形状。这个属性包括 abcdxy,6个 flout 值,表示一个矩阵,比较复杂,一般不用这个。而是直接使用角度,大小了控制形状。注意角度是弧度制,可以利用系统所带的宏 M_PI 来使用π,来描述角度值是多少,一般都是整数倍。


uibutton 属性:

1.normal 属性 ,普通属性,没被触发时的属性

2。hightlighted,高亮状态,被触发的时候的状态

按钮还有其他状态


使用 background 添加图片,图片会自适应 uiview 的大小,


经常遇见的错误:

setvalue:forundefinedkey:表示是在某个 uiview 中连接了一些已经删除的方法,手动清理一下 uiview 连接的方法即可。还有一种是发送消息给为止实例,也可能是 UIVIEW 中有未清理的方法连线。

如果出现点击按钮报错,首先检查一下是否有未清除的方法连线。


要控制一个对象,首先得拥有这个对象,可以通过把这个对象设置为属性,这样就可以对自己的属性进行操作了。在 uiview 这个大窗口中,满屏的 uiview 就是父类,其他内部的都是子类,要控制子类对象,把子类对象当成父类的属性即可。

在 oc 语法中规定,不可以直接对某个对象中结构体属性的成员进行修改。如果某个成员变量是结构体,那么就不能够直接修改这个结构体中的一些值,只能够对整个结构体进行修改。(以最上层的结构体开始就不能单独修改了。)


对于 id 类型的对象,是不允许使用点语法的,因为不知道这个 id 对象有什么属性,所以只能用【xxx 方法】,


添加对象的监听用对象方法 addTarget




一定要灵活熟练掌握 block 的使用方法,使用场景之一是,当头尾部分有重复代码时,可以把中间不同的代码存入 blcok 中,然后再调用,可以简化一些代码,但是要注意 block 内部是不能对普通的外部变量的 值进行修改的。除了定义为__block。


设置一些属性的方法通常是使用 set 开头的。用于设置对象的属性,一般 set 方法都会有对应的点语法.


图片的 mode,内容模式,fill,填充,宽高比相关,适应窗口,改变宽高比例。fit,适合,不改变宽高比,自适应 屏幕。


value ,滑动条,默认最小值是0,最大值是1,可以修改。


监听事件就是用 ibaction,如果控制这个对象的一些属性就是用 iboutlet,


%.af: a 表示 小数位数,如果不写或者写0则表示不显示小数部分,但是 ”.“  点要写。

在 storyboard 上,视图操作能实现的代码都可以实现,不同的是代码可以实现的视图操作不一定能实现,使用代码可以动态更改 view 的一些属性,但是在视图操作中没有这样

的设置可以实现这样的功能,例如图片切换。


property list


plist 文件:可以用于保存一些文件,在 resource 里面创建这个文件,把 plist 加载进程序中会返回一个 root 对象给程序,需要用到一个类,把 plist 的全路径找出来然后才能导入程序中,这个类就是 nsbundle(捆绑,压缩)


获得全路径的方法:

 NSBundle *bundle = [NSBundle mainBundle];

    

    [bundle pathForResource:@"文件名" ofType:@"文件类型名"];


获取全路径只能是一个文件的,不能是整个文件夹的




对于经常调用的代码一定要 想办法提高性能,避免过多的重复调用,io 操作,读取写入文件都是比较消耗性能的,一定要把产生重复结果的代码提取出来。可以考虑 viewdiload 方法,对于一直存在的对象可以在控制器中声明为属性,这样只要还在这个控制器界面,那么这个控制器对象就不会消失,这个属性也就会一直都在,这样对于那些产生重复结果的都只需要执行一次就可以了,这样可以提高性能,一定要记住对于代码中重复的代码,产生同样结果的代码一定要提取出来,需要长期存在的就想办法保持这个变量的声明周期,放在控制器属性中是一个不错的选择。

比如监听按钮时,每次按下按钮如果都会有一些重复的行为或者重复的结果产生,那么这个代码就还可以抽取出来提高性能。


float 强转 int 是不会四舍五入的,但是打印的话,如果使用  %.f  即打印一个小数但是小数位为0,那么这样打印就会是四舍五入的,而对于 float 强转 int 可以通过+0.5的方法来手动设置为四舍五入。  


uiview 对象中的 label 对象的 lines 表示行数,可以显示多少行,设置为0就是默认自动换行,不限制行数。


判断是否消耗资源的标准是?是否每次都产生一个新对象新变量?是否每次都产生相同的结果,但是这个结果存放在新产生的不同的对象中


改变图片的大小尽量使用 transform,这样是以中心点来放大缩小的,如果使用 frame,如果只改宽高的话,原点是不变的,这样看起来很不舒服,不建议使用。


程序加载的过程一定要弄清楚:



显示图片一般有两种方式,一种是 imagview,一种是 button,如果图片不需要点击,只需要显示,用前者比较好,如果需要监听点击图片事件,就用 button。


如果不需要上传到 github 服务器,创建 project 的时候不需要勾选 git 选项,这个是代码管理选项,用于打包代码的。


运行项目出现 finish running 错误可以看看是否项目名或者项目标识冲突了



在提取重复代码时,如果是代码相同但是参数不同,并且参数是有规律的,可以考虑使用循环来简化代码,首先设计好第一步,因为之后的每一步都是重复第一步,只不过参数有不同,如果参数是有规律的话就可以使用循环来简化代码了。第一步通常会定一个基准,后面的参数都是由这个基准转变得来的,这个基准可以自己定义。


代码抽取,只要把相同的步骤抽取出来,再把不同的东西设置为参数即可。


imageView 和 button 的区别,

imageView 只有 image 这个属性可以放图片,并且会填充满 image view 设置的框,图片默认不能响应点击事件的,继承 uiview, imageView 有连续播放图片的功能,这样就形成了动画

button 有 image 和 backgroundImage 两个属性可以放图片,并且这两张图片可以同时在 button 上显示,图片会挡住背景图片,背景图片就是起到背景的作用,背景图片会拉伸填充这个 button 的框,但是前置 image 就不会适应框的大小,还是保持之前的尺寸。

button 可以响应点击事件,button 还能够显示文字,titel 属性,前置图片在左边,文字在右边,如果没有 title 或者没有前置图片,那么前置图片或者 title 就居中显示,通常图片和文字搭配一起的,使用按钮,继承uicontrol,如果是继承自 uicontrol 那么这个子类就都有监听的方法。addTarget 方法,谁触发了这个事件就把谁当成参数传递给要调用的方法,触发事件有多种,也是参数之一


打印时的占位符好:如果是以下格式:%02d,i,表示打印的 i 的值无论怎么样都是2位数字,如果不足两位数字的高位补0.,如果超出的话,只打印高位的2位数字,即 0 表示 用什么来补,如果写为%2d 则用空格来补高位。


加载图片是有缓存空间的,十分占用内存,要对图片加载和 io 操作尽量进行优化,运行程序时,首先把程序加载进入内存中(程序是放在另一个空间,类似于内存卡,和运行的内存是不同的空间),然后加载图片时,系统首先查找缓存中是否有对应的文件,如果没有,就去存放程序的空间中(不是程序运行的空间,存放空间是存放所以程序需要的文件资源的地方,运行空间只是加载代码,不加载资源)找到对应的资源然后放入缓存中,下一次再使用就可以再缓存中直接找到,日过 i 怕程序不停止,那么缓存 中的东西就会一直存在,如果对于某些需要经常使用的放在缓存中效率会更高,但是如果对于只使用一次的放入缓存中就十分占用空间,再使用完成后需要及时清理缓存,

一般不使用这种加载图片的方法,使用的是无缓存的方法,initContentsOfFile 这个方法加载图片就是无缓存的,



内存泄露检测工具:product - profile - allocations ,



xlb 和 storyboard ,storyboard 是 ios5.0之后才出现的,


代理模式,mvc,xlb,在开发中几乎每天都会涉及到



bar 条,工具条,搜索条,导航条(navigation切换不同页面的),
toolbar 的高度是不能改的,默认的高度,用其他 uiview 也可以模拟 toolbar,但不同的是 toolbar 内部只能放 barbutton,并且 barbutton 的尺寸是自动的,如果是用其他 view 模拟 bar,那么其中的子 view 的尺寸要手动调整,如果要在 bar 中放入其他的 view,那么先会包装成一个 barbutton 再加入 bar 中

style 是用来设置背景样式的,即边框样式
plain :简洁样式,只有文字没有背景
boardered:圆角标样式
done:背景色不一样

alpha 透明度。1 不透明,0,透明,0.5 半透明。


更改项目名称:更改项目名称不能简单更改,因为项目中的所有文件都是相互关联的,如果只改名称那么关联中的名称是没有改变的,这样就会找不到相关的文件,要改项目名必须在项目中更改,不能直接改文件名,在项目中更改编译器会弹出提示框,提示把所有的相关联的引用都进行更改,rename,manger scheme,这两个地方改,还有built setting 中更改所有涉及的引用,在 xcode 中的文件和硬盘上的文件夹是不同步的,如果实在还是不行,那么久删除xcode 中的文件,再重新添加硬盘中文件夹的文件进去,

·

arc4random() 这个方法会随机产生任意正整数和0

arc4random_uniform( int num) 这个方法会随机产生任意 大于等于0,并且小于 num 的整数。


每一个父控件都会有自己的一个子控件数组,一个父控件可以是别的控件的子控件,它们的数组不冲突


storyboard:用于搭建比较答的界面,用于描述一个程序的流程,实际项目中,一个 storyboard 通常有十多个界面。用于描述整个程序的流程和体系,一个程序的所有整个界面都在 storyboard 中,


xib:小范围的界面搭建,轻量级的,一个小界面就是一个 xib 文件, 可以通过加载 xib 文件来创建一个 uiview,要加载一个项目环境中的所有资源文件,就要用到 bundle 这个类中的一个方法,mainbundle,bundle 的意思是捆绑,通过这个类来获得全路径。

nib = xib ,在开发阶段称为 xib,打包称为可安装程序 ipa 后,xib 就变成 nib


想取出一个父类uiview 中的子对象可以通过 subviews 数组,但是数组需要正确的顺序,如果使用 tag,一样可以取出对应 tag 的子对象,并且不用在意顺序


好的程序代码如果要修改时只需要修改个别地方,其他地方都跟着修改了,不用到处的改,所以要抽取相同的代码出来。


storyboard 可以拖方法,xib 不能连方法,因为 storyboard 处在控制器 viewcontroller 环境下,storyboard 可以和所属的 class 的文件进行连线,同理,要连接 xib,把 class 修改成为要连线的controller 就可以了


通常出现的 exc_bad_access 错误指的是野指针错误;


xib 的加载过程:首先加载 xib 文件,然后确定是调用了哪个对象的方法,得到一个数组,这个数组是这个 xib 文件中的所有控件,xib 文件其实是一个 xml 文件,把所有图形话操作都转为代码,xib 的用途是非常多的。1


 NSArray *views =  [[NSBundle mainBundle] loadNibNamed:@"rowView" owner:self options:nil];


这句代码首先解析 xib 文件,然后创建 xib 下的所有对象,按顺序创建,自动生成代码,就和使用代码创建 view 对象一样,把 view 的所有属性都进行赋值,最后转变为可视化图形显示在手机屏幕上,就和自己使用代码创建过程一样,如果 view 中有绑定的事件,那么就会 addtarget 方法创建连接,target 中也有一个参数是方法的对象,阅读ios 的代码就像阅读英文句子一样,可以更好理解代码所要表示出来的意思。


要使用 xib 分为两步,第一步要把 xib 的 class 属性设置一下(这个值可以写任何值,自己创建的 class 也可以,不一定要系统的,并且通常在实际项目中都会是写成自己定义的类,mvc,但是注意自定义的类必须是相关类的子类,即只能是 uivew 类的子类),这样就可以连线方法了,然后第二步是在代码中还要在传入一个实际对象的参数,告诉编译器这个对象调用的是哪个对象的方法,在代码中传入的是实际作用对象,在图形界面中是为了连接方法,类似于@class,真要用上时还是得用。h 文件。


使用 xib 来监听按钮事件是非常不推荐的,因为 xib 的文件只是为了描述界面用的,同一个界面可能出现在多个不同的 满屏 view 中,如果只绑定一个 viewcontroller,那么这个界面就只能用在这个满屏 view 中了,复用性太差,界面就是界面,不要带有控制的功能,这就是 mvc,控制,界面,模型,分清界限,分工合作,一定要减少耦合性,核心思想就是减少耦合性,


MVC 简单理解就是:controller ,view, model, view 是展示,model 是模型,是数据,controllor 是负责把数据传递给数据,要展示东西,就必须先有东西,这个东西就是 model,但是如果没有 controller,直接把 model 给 view 展示的话,一个 view 只能展示一个 model,如果要展示其他 model,或者说把 model 换一种方法展示,那么久必须改变它们的关系,耦合性太强,如果是通过控制器 controllor 来控制这一过程,不管 modle 如何改变还是可以传递给 view 来进行显示,检验一段代码的好坏标准之一就是假设如果要更改需求时,对这段代码需要做怎么样的改动,改动越小就越好,要改的东西很多那这段代码就是垃圾。



uiscrollview  scroll 滚动,可以滚动屏幕,所有的控件都是继承自 uiview,      uiimageview  也可以设置图片,但是 uiimageview 不具备滚动图片的功能,其中,frame 是当前 view 的显示宽高,就是屏幕上能实际看见的宽高,在 uisrcollview 中,有一个 contentsize 

属性,这个属性是表示可以滚动的范围,和屏幕显示范围是两种不同的概念,uisrcollview 还有很多经常使用的属性,比如是否显示滚动条,是否显示弹簧效果,contentinset::用于增加 scrollview 的额外的滚动区域,分上左下右的范围。contentoffset,这个属性也经常使用,用于记录 scrollview 滚动的位置,就是当前这个显示层窗口中,是在底层内容中的哪个位置,contentoffset 是一个 cgpoint,这个 xy 是以底层内容为参照系的,不是手机屏幕,也不是本身,而是底层内容,有了这属性就可以精确的在scrollview 中显示对应底层坐标的内容,也可以通过代码来动态显示底层内容。使用 contentoffset 来设定框架范围是可以超出底层内容尺寸的,但是只是显示而已,不会更改 content 的范围,不管是 inset 还是 offset,都不会更改以底层内容的 0 ,0 位置为原点的设置,

多层思想,一层一层的区分,显示层,底层

contentsize 设置底层内容的范围,以底层内容的 0 0为原点计算,要注意 contentsize 和可以显示的范围是完全不同的概念,contentsize 与显示无关,只和可以滑动的范围有关,如果滑动范围为0,但是 scrollview 的 frame 范围为整张图片的范围,那么不可以滑动,但是可以显示整张图片,只有滑动范围大于或等于scrollview 的范围时(x 或者 y 单方向上大于也可以),才可以进行滑动

contentinset:增加 scrollview 这个显示窗口 可以移动的范围,但是不会改变原点的坐标

contentoffset :记录并且可以控制当前 显示窗口的坐标,这个坐标是显示窗口左上角的坐标,并且还是以 底层的 0 0为原点,而不是屏幕的,并且可以控制这个坐标任意范围的改变,但是仍然不会改变原点,就像坐标轴一样,有正负区域,原点在中心。

一个 uiview 的 frame 属性是显示在屏幕上的大小,同样的 scrollview 的 frame 属性就是显示窗口的大小,而 contensize 属性是底层内容的大小,不是在同一层中的概念。


uiimage 和 uiimageview 是两个不同的类,uiimage 继承自 nsobejct,而 uiimageview 继承自 uiivew,uiimage 的对象是 uiview 对象的属性之一




图片缩放功能也是使用 scrollview,首先告诉 scrollview 要缩放自己的哪个子控件,只能作用自己的子控件,通过设置代理对象来进行操作 delegate,委托,代理,scrollview 中有一个属性,代理属性,这个属性的对象必须遵守 scrolldelegate 协议,并且实现协议中的方法,其中的方法之一就是缩写方法,告诉 scrollview 要缩放哪个子控件,并且协议中的方法都是可选的,每次用户操作都会调用一次这个方法,捏合一次调用一次。


缩放过程:

当用户尝试进行缩放或者放大行为时,scrollview 就会知道,要进行缩放或者放大了,但是不知道是对哪个子控件进行这个操作,然后 scrollview 就会向它的代理发送一个消息,注意代理是一个对象,这个对象是 scrollview 中的一个成员变量,是他的属性之一,这样 scrollview 就能够调用这个对象的方法,即调用代理的一个方法,这个方法是协议中的方法,代理对象进行了实现,然后代理对象就能够返回需要进行缩放放大的子控件对象,这样 scrollview 就能够知道是对哪个子控件进行操作了,那为什么不直接告诉 scrollview 要操作哪一个子控件呢?因为 mvc 模式中,view 对象就应该只干 view 对象的活,它不应该知道需要对哪个子控件操作,要对哪个子控件操作应该由 controllor 来告诉它,然后再设置最大放大倍数和最小缩小倍数,


代理模式目的之一就是减少耦合性,遵守代理协议可以让双方都清楚知道可以发送什么消息和接收什么消息,代理其实是某个对象,这个对象是另一个对象的一个属性,协议是一份方法列表,或者说消息列表,定义了有什么消息可以发送,有什么方法可以调用,那么要调用属性对象的方法只要是这个列表中的都可以调用,这样就灵活实现两个对象间的互动,总之记住一点,协议的本质还是两个对象之间进行互动,为了更小的耦合性,为了减少对代码的改动,使用各种各样的设计模式,包括代理模式。

观察者模式,也称为监听者模式,在这种模式中,通常都使用代理,观察者模式,即一直在观察另一个对象的行为(方法),如果另一个对象触发了某种方法,那么观察者本身会得到消息,知道被观察者触发了某种方法,监听者模式也类似。

代理是对两个类之间的互动增加了一些约束而已。一般使用代理的场合

1. A 对象想要 B 对象完成一些方法,行为,这些方法行为B 能够完成,就可以让 B 成为 A 的代理

2. A 对象发生了某些行为,并想通知 B 对象,或者说想把一些数据传递给 B 对象,那么也可以把 B 设置为 A 的代理对象。

3. B 对象想要监听 A 对象的某些行为,那么也可以让 B 对象成为 A 对象的代理对象。

代理设计模式使用非常频繁,如果代理模式设计得好的话会非常方便灵活,一定要掌握好代理模式,


代理设计模式简要步骤如下:

1.定义协议

2.代理对象遵守协议,实现方法

3.A 对象中要有一个属性,这个属性就是 A 的代理对象。通常设置为 delegate

4.把 B 对象传给 A 的属性,让B 成为 A 的属性之一。

5. 通常代理协议中定义的代理方法都是以 A 对象的名称开头。


scrollview 分页:

更改scrollview 的一个属性即可:pageenable ,系统就会按照当前 scrollview 的 frame 宽度对整个 底层内容进行分页,注意是当前 scrollview 的frame 宽度进行分页。


uitableview:非常重要的一个控件,table 表格的意思,表格无处不在,通讯录就是经典的例子,聊天布局也是表格,

表格一般分为简洁表格和分组表格,即多组数据和单组数据的显示,ground  和    plain;


tableview 想要展示数据首先都有数据源,要成为数据要遵守数据源协议,并且有一些必须实现的方法,有3个必须实现的方法,当 tableview 要展示数据时,就会自动调用代理对象(也就是数据源)的方法,即给数据源对象发消息,然后数据源对象会返回相应的值,一般会调用3个方法,3个必须实现的方法,3个方法返回3个值,然后 tableview 对象就能够知道在这个 tableview 中一共有多少组(section)数据,每组数据有多少行(row),每个组中的每一行要显示什么数据。这3个方法的调用顺序是固定的,先知道有多少组,再知道每组多少行,再知道每行什么内容。但是每个方法的调用次数是不一样的,知道多少组一次就够了,知道每组多少行根据组数来确定,每行什么内容根据总行数来确定。每组有一个头部属性和脚部属性,就像页眉页脚,header,footer,


mvc 中的 m 就是 modle 模型,如果是专门用于表示数据的对象,一般都称为模型对象,只有数据内容,没有行为内容,模型对象,表示数据的对象。plist 就是模型对象之一,只要存储数据的对象都叫模型对象, 


id 对象是不能调用点语法的,不过能直接调用方法,从数组中取出来的对象不能够直接使用点语法,因为编译器会将其当成 id 对象看待,因为数组什么对象都可以存放,但是可以使用方法,即用中括号括起来。



在实际开发中,通常是先从服务器获取到所有的数据,然后把数据转成模型对象,实际项目中的数据是非常多的,


开源拼音处理库,pinyin4objc, Pinyin4,


kvc \ kvo   :


单组数据显示:在实际开发中,更多的是 使用单组数据显示  

uialertview:弹框控件,

蒙板:开发中的术语,表示这块板之下的东西都不能点击了,屏幕显灰。


子控件中如果某些行为被触发,比如子控件中的按钮被点击了,那么这个子控件就会发送消息给代理,告诉代理对象自己的按钮被点击了,然后由代理对象决定要发生什么行为,这也是 mvc 的思想体现,要发生什么行为不需要由 view 对象决定,而是由 c 对象决定,c 对象需要知道什么时候子控件的行为被触发了,所以当子控件的按钮被点击时,子控件就会发送消息给代理对象,如果代理对象返回一个消息,那么子控件就会显示对应的消息,mvc 就是这样的一个模式,mvc 中任何要更改数据的行为都应该由 c 对象告诉 v 对象。


在 iOS 中,所有的代理方法都会把自身当成参数传递给这个代理方法,好让代理对象知道是处理哪一个对象的代理方法,所以自己设计代理方法时,也应该把被代理的对象当成参数传递给方法。


tableview 的数据刷新都是分为两步,首先改变数据,然后再重新载入数据,这样才能完成数据的更新,reloaddate 方法会再次调用创建 tableview 的方法


在两个方法之间寻找桥梁:如果两个或多个方法之间有某个或者某些参数是同一个对象或者变量,那么就可以通过这个对象或者变量来建立方法之间的桥梁,因为调用方法的是有先后的,对象本身有属性,通过这些属性可能就能够联系两个不同的方法,uiview 对象的 tag 属性就是一个很好的桥梁,


局部刷新,如果在 tableview 中的 row 有非常多行,那么整体刷新很浪费时间,可以只刷新局部,可以准确的刷新某一行,或者是某些行,有系统自带的方法。


tableview 的性能优化:

如果一个 tableview 中的cell 过多,即行数很多,如果不进行性能优化的话程序会很卡,但实际系统不会一次创建完所有的 cell,而是显示哪些行的时候才创建哪些行,如果一共有500行,屏幕最多显示10行,那么系统每次只创建10行,等到滑动到其他行时才依次创建对应的行,ios 系统是十分注重效率的,用到什么才创建什么,最大的提高性能,实际上,创建过的 cell 如果看不到了,就会销毁掉,也就是说,当往下滑动时会创建靠后的cell 对象,当往回滑动时也还会创建之前的 cell 对象,只有当前能够显示的对象是存活的,只要看不见了,那么这些对象就会被销毁掉,减少内存的占用,只要有新对象创建,只要有 alloc都会分配新的内存空间,如果不销毁一些对象,那么是十分占内存的。但是重复创建也很消耗性能,实际上只需要10+1个 cell 对象就可以完全显示完所有的 cell 对象,通过一个缓存池存放临时的 cell,如果缓存池中没有 cell 对象,就新建 cell 对象,如果缓存池中有对象,那么优先使用缓存池中的对象,缓存池中可能有多种 cell,所以在创建 cell 中时候要绑定一个标识符,在同一个 tableview 中展示的cell 都应该是同一中标识的 cell,tableview 对象自带缓存池,但是如果用户滑动的非常快,那么可能缓存池中没来得及放入原来的 cell 对象,那么也会创建新的 cell 对象,优化的思想就是缓存池中有备用的对象就拿备用的来用,如果没有,就新创建对象。id 标识符是固定的,凡是固定的变量都可以定义成为 static,静态变量创建一次就够了


xxxxfile 传全路径

xxxname 传文件名


在 xcode 中 new ground 一个文件夹,是一个虚拟文件夹,使用的时候不需要写文件夹名,直接写文件名就可以了,实际上并没有这么一个文件夹存在,只不过为了好看才有了这么一个虚拟文件夹的,所以资源文件夹中的文件是不能重名的,不然会被覆盖掉,要记住文件夹是虚拟的假的文件夹,但是也可以创建真实的文件夹。



tableveiw 中的 select 和 deselect ,select 是某行被选中的时候触发的方法,deselect 是某行被取消选中(即选取了其他的行)时候调用,已 de 和 un 开头的单词一般都是取反的意思,


通过数据控制状态,控制 view,数据就是 model,


































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值