如果使用高版本的xcode6以上,创建一个singleViewApplication项目,然后点击项目修改maininterface中的内容清空,相当于创建了一个EmptyApplication。
5.window对象
在一个IOS的应用中,window对象一般只有一个,window对象负责一些系统功能,比如键盘管理,一般不负责具体界面的显示。为了可以在一个应用中切换多个界面,我们不会直接在window放置一些具体的控件、视图(Lable),而应该给window对象设置一个根视图控制器(玻璃),做为第一个显示界面。
6.屏幕的窗口 显示内容的空间大小。
屏幕的大小 分辨率
点(坐标) 像素
iphone3GS 320*480 320*480 3.5寸
iphone4/4s 320*480 640*960 3.5寸
iphone5/5s 320*568 640*1136 4.0寸
Retina屏上1个点 = 2*2个像素
非Retina屏上1个点 = 1个像素
注:
程序中计算位置和大小使用的单位是点,到了具体的硬件上,自动转换相应的分辨率。
坐标系:屏幕的左上角为0,0原点
如果在普通屏幕上1一个点代表1个像素,在高清屏(Retina视网膜)屏幕上,1一个点代表2*2个像素。
7.具体描述屏幕的位置和大小的frame属性
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRectCGRect;
structCGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPointCGPoint;
structCGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSizeCGSize;
8.根视图控制器(root view controller)
视图 显示数据
视图控制器 控制显示什么数据
一个界面有一个视图对应一个视图控制器
控制台的警告也是指的根视图控制器
根:最下面的视图控制器
程序执行顺序:
main.m->AppDelegate->window.rootViewController->ViewController->View->ViewDidLoad…
9.视图控制器(ViewController)和视图(View)
a.具体的功能
视图(View) 就是我们看见的界面
视图是UIView类或子类的对象(与VC的关系是组合有关系)
视图控制器(ViewController,简称为VC)
控制视图如何显示的对象
是UIViewController类或子类的对象
总结:一个界面通常就是一个视图控制器,显示部分由属性view来解决,显示的内容由视图控制器来解决。
b.之间关系
一般情况下,视图控制器默认就拥有一个视图,视图就是视图控制器的小跟班。在创建一个视图控制器对象(VC),此VC就拥有一个视图对象,做为VC的一个属性存在。self.view(组合)。
10.视图与window对象
window相当于电视机,视图相当于电视节目的元素,小到花花草草在到宇宙万物(当然电视由于屏幕大小,只能看到一部分)。
一、viewDidLoad方法
1.1 是什么
是UIViewController类中定义的方法
1.2 在什么时候调用
在VC所控制的界面(View)"第一次"需要显示出来的时候,需要加载VC,等加载VC后,自动调用此方法。
1.3 干什么
在此方法中设置界面的初始显示
1.4 注意
一般此方法的第一会调用父类的方法,目的是让父类中的设置也起作用。
二、控件(Control)
2.1 什么是控件
严格来说,凡是UIControl类及子类的对象,才叫控件,控件会触发事件。严格来说UIButton是控件,UILabel不是控件。一般来说,口头上的经常能在界面上看见的东西,都叫控件。
2.2 控件(UIControl)和视图(View)的关系
控件就是视图的一种
UIControl是UIView的子类
三、按钮控件(UIButton)
操作步骤:
3.1 创建按钮对象
使用工厂方法,UIButtonTypeSystem
3.2 设置相关属性
title按钮上显示的内容
state按钮状态
[buttonsetTile:…forState:…];
3.3 加入到父视图中
3.4 添加事件(Event)
addTarget:action:forControlEvents:
target:目标
当按钮触发了事件时,向哪个对象发送消息。
经常使用self,向当前对象发送消息。
action:动作
向target对象发送什么消息
events:事件
当用户触发了按钮对象的哪种事件时,才向target发送action消息。 UIControlEventTouchUpInside手指在按钮上按下并抬起时,触发此事件。
UIControlEventTouchDown手指在按钮上按下时触发此事件。
注:自定义的视图内容,要添加到自定义的视图控制器中,所以自定义一个类继承UIViewController。
四、视图控制器的创建方式
4.1 代码的创建方式 code
4.2 图形化界面的创建方式 xib(IOS5.0前)/storyboard(IOS5.0后)
4.3 执行过程
main.m->Appdelegate->appliction…->
***[TRViewControlleralloc]initWithNib …]
4.4 操作步骤:
1>拖拽(show the object Library)相应的视图或控件到xib文件中。(xib自动创建一个相应的对象)
2>连线 (ctrl+鼠标左键连线,鼠标右键连线)
IBOutlet
使用类似于组合的模式,创建属性对象。(Xib)
是一种属性,这种属性指向了xib中的一个对象。
IBAction
是一种方法,这个方法连接到了xib中的一个控件,当用户触发了这个控件的事件方法,会调用此方法。
4.5Interface Builder(IB)
1>是什么
是一个工具软件,以前是独立的,从xcode4开始集成到xcode中了。
2>干什么
帮助程序员设置和构造界面用的,可以不写代码或少写代码来构建界面,从而提高我们的开发效率,所见即所得。
3>工作原理
将界面上需要的控件(或视图)的创建、属性的设置、之间的关系等都保存到一个xml文件中,程序运行时,从xml中读取所有的控件信息、配置,自动创建这些对象,自动加入到父视图中。
4>一些文件
.doc(office2003以前) .docx(office2003以后)
.nib .xib
VC类->*.h *.m
IB->*.xib
4.6 连线常见问题
1>xib中的视图或控件与类中的属性关联错误
删除类中的属性,并不会删除连线关系
'NSUnknownKeyException', reason: '[<TRViewController0xa8509b0> setValue:forUndefinedKey:]: this class is not key valuecoding-compliant for the key myLabel.'
2>xib中的控件与类的事件方法关联错误
删除(修改)类中的方法,并不会删除或修改连线关系
'NSInvalidArgumentException',reason: '-[TRViewController onClick]: unrecognized selector sent to instance0x8c33da0'
解决:删除原有连线,重新连线。
3>自己创建视图控制器中的根视图,默认是不会连线的。
'NSInternalInconsistencyException', reason:'-[UIViewController _loadViewFromNibNamed:bundle:] loaded the"TRViewController" nib but the view outlet was not set.'
解决:自己连线。
五、详细操作
5.1 步骤(视图)
a.创建一个视图控制器,并创建相应的xib文件。
b.将视图控制器设置成根视图控制器(rootVC)。
c.在show the object library中,拖拽相应的视图或控件到父视图中。
d.按住鼠标右键,连接相应的视图连线到相应的类(.m文件)的@interface部分。
e.如果需要视图加载的时候,初始化子视图,应该在viewDidLoad方法,通过属性进行修改。
注:相应的xib中的视图控制器类型要与视图控制器的类的类型相匹配。
5.2 步骤(事件方法)
a.创建一个视图控制器,并创建相应的xib文件。
b.将视图控制器设置成根视图控制器(rootVC)。
c.在show the object library中,拖拽相应的控件到父视图中。
d.在xib中,右击相应的控件连线到相应的类中(视图控制器.m件implemention部分),会弹出一个对话框,设置相应的参数,会自动生成相应的事件方法。
5.3IBAction对应的事件方法的参数
任何一个控件产生事件时,如果调用一个方法,且这个方法有参数,就会将控件自身传给这个参数。(事件源)
默认情况下,事件源的参数是id类型,使用前必须进行类型转换。
总结使用控件四个步骤:
(1)创建控件
(2)设置属性
(3)添加事件方法
(4)添加到父视图
六、控件S
6.1UIStepper 控件
重要属性:
.value当前值
.stepValue步进值(每一次增加或减少多少)
.minimumValue最小值
.maxmumValue最大值
最常用的事件:
valueChanged(stepperValueChanged)
练习:改变UIStepper的初始值,默认为20.
取值范围是-50~+50之间,每次步长为5,显示在Label中。
6.2UISlider 滑块控件
重要属性:
.value当前值
.minimumValue最小值
.maxmumValue最大值
最常用的事件:
valueChanged
6.3Switch 开关控件
最重属性:
.on: BOOL (getter:isOn)
常用事件:
valueChanged
//指定getter方法为isOn
@property(nanatomic,getter=isOn)BOOLon;
//通过UIColor类,可以得到一个颜色
self.myLabel2.backgroundColor = [UIColorcolorWithRed:0.5green:0.0blue:0.0alpha:1.0];
1.UIAlertView
弹出一个警告小窗口。
使用步骤:
1)创建对象
2)设置属性
3)show方法显示出来
4)设置被委托对象
1>遵守协议<UIAlertViewDelegate>
UIXXX+Delegate…
2>实现方法
- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
2.委托(delegate)
2.1 是什么
一个对象(A)委托另一个对象(B)做事(调用方法)。
我们把A叫委托方(委托对象),把B叫被委托方(被委托对象)。
2.2 委托协议
委托方希望被委托方能做的事情写入协议。
委托方就是UIAlertView,被委托方就是self(viewController)。
同时定义了委托协议UIAlertViewDelegate。
2.3 被委托方需要做的事情:
(1)遵守协议@interface … <委托协议>
(2)实现协议中要求的方法
(3)将委托方与被委托方建立联系(通过属性关联)
alertView.delegate =self;
使用时,将委托对象调用被委托对象的方法,这种方式叫回调。(CallBack)
3.UIActionSheet
3.1 是什么
类似UIAlertView的一个选择框。(分享)
3.2 使用
1)创建对象
2)设置属性
UIActionSheet *as =[UIAction Sheet alloc]initWithTitle … delegate … cancelButtonTitle …
3)设置被委托对象
1>遵守协议UIActionSheetDelegate
2>actionSheet: clickedButtonAtIndex...
4)在某个视图下方弹出来
[asshowInView:self.view];
注:这个方法不可以用在viewDidLoad方法中
4.UITextField文本框控件
4.1 是什么
是一个单行文本框控件,用来接收用户输入的信息。
4.2 使用
与前面的控件相类似。
4.3 重要的属性
.text 文本框中的内容
.secure… 密文的形式显示信息
.placeHolder 文本框的提示信息(淡显)
clearButton 是否出现清除功能
keyBoardType 还可以指定虚拟键盘的类型
Appearance 键盘显示的样式
ReturnKey 右下角的按钮提示
4.4 设置被委托对象
1)代码方式
self.password.delegate= self;
2)图形化界面方式
右击相应的文本框控件连线到相应的file’s owner
4.5 相应事件方法的功能
以下事件方法,描述了文本控件使用时候的生命周期:
将要执行编辑文本框内容时执行
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{}
已经开始文本框内容的编辑
- (void)textFieldDidBeginEditing:(UITextField *)textField{
}
文本框内容编辑将要结束
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{}
文本框内容编辑已经结束
- (void)textFieldDidEndEditing:(UITextField *)textField{}
文本框的内容发生修改
- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string{}
清除文本框的内容执行
- (BOOL)textFieldShouldClear:(UITextField *)textField{}
点击虚拟键盘右下角的按钮时执行此方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField{}
4.6 隐藏键盘
1)第一响应者
一个界面中一般只有一个第一向响应者,如果UITextField控件变成第一响应者,键盘会自动弹出。
如果想取消键盘(隐藏),就得让UITextField控件放弃第一响应者身份,向对象发送resignFirstResponder,就可以让textField控件放弃第一向应者。
2)有三种方式
1>点击按钮向文本框发送消息,隐藏键盘。
2>点击空白处也关掉文本框修改父视图的类型
a.UIView->UIControl
b.添加相应的事件方法 touchUpInSide
3>点击虚拟键盘右下角的return键盘
textFieldShouldReturn:
一、MVC 设计模式
1.1 MVC是什么
是一个大型综合的设计模式。
设计模式是解决某一类问题的一种最优的办法。
1.2 为什么要用设计模式
提高程序的可重用、可扩展性、可维护性。
苹果的系统大量的使用了设计模式。
1.3 MVC简介
M:Model 模型
处理数据和业务逻辑,保存数据、网络通信…业务计算。
V:View 视图 xib
给用户提供界面显示,接收用户输入。
C:Controller控制器
控制程序的流程及跳转,协调View和Model之间的工作。
课程安排:
control&controller
view
model
1.4 MVC之间的关系
CV:
C->V(IBOutlet)
V->C(TargetAction,IBAction,Delegate)
CM:
M不能访问C的
C->M 通过属性的方式或发送消息关联在一起的。
VM:
不能访问,不可以交互的。
1.5 多MVC(多界面开发)
应用程序中有多个界面,而每一个界面就是一个MVC,所以说多界面开发就是多MVC开发。
操作步骤:
a.创建两个VC类
b.创建一个VC对象,并设为根视图控制器
c.添加了一个按钮,并添加了相应的事件方法
1>创建第二个VC对象
2> [selfpresentViewController:vc2animated:YEScompletion:nil];
d.在第二个VC对象中,添加一个按钮和相应的事件
[self dismissViewControllerAnimated:YES completion:nil];
视图控制器的生命周期:重写(dealloc方法)
1>第一个界面的生在appdelegate中
第二个界面的生在第一个界面中的事件方法中
2>A界面跳转的时候,创建新的B界面,但原来的A界面没有销毁。从B界面返回A界面,原有的B界面就销毁了。
根视图控制器永远不会销毁。
1.6 传值
将VC1中的数据传给VC2中。
使用步骤:
VC1:
a.在界面跳转之前,创建VC2对象
b.并传值给VC2.属性(model)
传值的方式:属性、方法、自定义方法(事件源)
VC2:
a.声明一个属性(model),接收vc1传来的值。
b.第二个界面显示的时候(viewDidLoad)
将model的数据->view显示(label)
1.传值的方向性
如果从A界面跳转到B界面并传值,正向传值。
如果从B界面返回到A界面并传值,反向传值。
2.反向传值
VC1:
2>在VC1跳转VC2前,将自己赋值给VC2的属性。
3>在VC1声明一个属性,用来接收传值。(model)
5>重写了viewWillApear方法(每次界面显现的时候执行),将model的值->view(label)
VC2:
1>首先要保存前一个界面的引用(属性)
4>触发返回上一个界面方法时,将VC2值传给VC1的Model。
传值方式:
属性
方法
委托模式
"委托模式"传值方式:
1.定义一个委托协议—(1)
传值方式:属性/方法—(2)
2.委托方—(3)
创建一个属性关联被委托式(delegate)—(4)
反回前一个界面前,得到委托方的值—(9)
(textFieldvalue)->self.delegate.value= textFieldValue
3.被委托方—(5)
遵守协议—(6)
实现协议要求的属性和方法—(7)
接收到值后,将值显示在界面上—(10)
viewDidAppear-> self.myLabel.text = self.value;
4.将委托方与被委托方关联一起—(8)
在VC3->VC2之前,vc2.delegate = self;
补充:
声明属性时候的关键字:
assign 基本数据类型,默认assign
weak(MRCassign)
修饰对象的引用,仅仅是指向对象,不会通知对象的引用计数器加1。如果指向的对象销毁了,那么该引用会自动置空。
strong(MRCretain)
修饰对象的引用,当该引用指向对象的时候,会通知引用计数器加1 。
copy
修饰对象的引用,但是会将原有的对象内容复制一份,并得到新的内存地址。
*NSCopying对象的复制 深复制(深拷贝)
NSString*str = [NSString alloc]init…"hello"];
NSString*str2 = [str copy];
引用复制 浅复制(浅拷贝)
NSString*str = [NSString alloc]init…"hello"];
NSString*str2 = str;
int i =10;赋值
int *p =&i;赋值(传地址)
4.UINavigationController(导航控制器)
4.1 是什么
是控制器UIViewController的子类,是一个视图控制器的控制器,是用来管理其它VC的VC。(用来管理其它视图控制器的)
4.2 有什么用
管理和控制VC的走向,比present方式更好、更清晰。
4.3 怎么用
1) 创建一个UINavigationController的对象或*其子对象。并且要指一个根视图控制器。
2)推出一个界面(VC) 界面跳转
self.navitionControllerpush VC2
3) 返回前一个界面
a.会自动生成一个返回方式
b.指定一个事件方法返回
[self.navitionControllerpopViewController];
4.4 内部原理
1)navi内部维护着一个VC对象的数组
self.navigationControllers.viewControllers
将此数组当做栈来管理
栈是一种数据结构,特点是先进后出,后进先出。
2)navi必须有一个根VC,第一个被navi包含的VC。
3)push一个新界面(VC),旧的VC是不会被释放的。
4)navi会保持所有push进去的VC的引用,push一个VC其实是此VC放入到navi中的数组中。
5)当pop一个VC从navi中出来时,此VC就会被释放。
6)不能pop根VC
4.5 使用方式
传值:原理同上(present),重构传值练习。(正、反)
1)NavigationBar(导航栏)
导航栏主要分为三个部分,分别是左,中,右。
a.中 标题(Title)
在具体的VC,设置了一个属性self.title。(viewDidLoad)
当界面跳转时,默认的返回按钮,自动更新为上一个界面的标题。
b.左、右按钮
.navigationItem.leftBarButtonItem
.navigationItem.rightBarbuttonItem
c.UIBarButtonItem
专门用于各种bar上的按钮,和UIButton不一样的系统按钮。
系统按钮
initWithBarButtonSystemItem:target:action:
文字按钮
initWithTitle:style:target:action:
d.多个按钮
.navigationItem.leftBarButtonItems…
.navigationItem.rightBarButtonItems…
e.隐藏导航控制器头
self.navigationController.navigationBarHidden= YES;
2)ToolsBar 工具栏
工具栏默认是隐藏的。
a.显示工具栏
self.navigationController.toolBarHidden= NO;
b.UIBarButtonItem
专门用于各种bar上的按钮,和UIButton不一样的系统按钮。
系统按钮
initWithBarButtonSystemItem:target:action:
文字按钮
initWithTitle:style:target:action:
c.向工具栏添加按钮
self.toolBarItems= @[……];
d.美工具栏的样式
Fixed:固定值 填补指定宽度
Flexibile:弹簧效果,尽可能的填补空间。
3)在一个NavigationController中,可以继续使用present,当然也可以使用NavigationController。
1.copy
默认情况下,自定义的类是不具备copy能力的,必须遵守NSCopying协议,实现copyWithZone方法才可以具备copy能力,本质上copy就是新创建一个一模一样的对象(空间)。
还想复制相应对象的值,是不是要依赖一个初始方法,在创建对象的时候,要把复制对象的值也要传进来。
如果一个对象的属性修饰为copy,那么在给属性赋值的时候,相当于自动的发送了一个copy消息。
2.图像
显示图信息。
2.1 基本概念
数据 容器
NSString UILabel
UIImage UIImageView
2.2 在界面上显示图像
使用步骤:
1)创建容器对象,并指定数据对象
[[UIImageViewalloc]initWithImage:]
2)将它添加到父视图中
详细的操作步骤:
1)创建图像的对象,图像的文件名是包含扩展名的
2)将图像的对象放到图像的视图中
3)设置图像视图的位置和大小
4)将图像添加到父视图中
2.3 contentMode属性
设置视图显示的样式,类型UIViewContentMode类型(枚举)
//填充满屏(默认) 拉伸
UIViewContentModeScaleToFill
//保持图片的原样, 保持宽高比不留白边。
UIViewContentModeScaleAspectFill
//保持等比显示 留有白边
UIViewContentModeScaleAspectFit
3.UIScrollView
3.1 作用
在有限的区域中显示比较大的数据(图片、文字)。 3.2 本质
是一个View的View,用来管理其它的视图。
3.3 使用
将其它视图放入到ScrollView,设置相关属性即可。
3.4 关键属性
.frame scrollView的位置和大小
.contentSizescrollView的内容大小
注:
a.不要设置imageView.frame的大小,默认大小就是和图片的大小是一样的。
b.contentMode = …AspectFill;
3.5 重要属性
放大或缩小功能
1)比原来缩小多小倍
.minmumZoomScale= 0.2不能小于图片的20%
比原来放大多少倍
.maxmumZoomScale= 1.0不能比图片的本身大
直接指定比率的大小是不合理的
用物理屏幕的大小/图片的大小
使用宽/高比值最小的那个
2)通过委托模式解决最终的问题
给scrollView指定delegate对象,回答以下问题:
对scrollView中哪个子视图进行缩放操作
-(UIView*)viewForZoomingInScrollView…{
returnself.image;
}
3.6 重要属性
//翻页的时候 整页翻
scrollView.pagingEnabled =YES;
.showHorizontalScrollIndicator 显示横条
.showVericalScrollIndicator 显示竖条
4.UIPageControl
4.1 重要属性
currentPage 当前页号
numberOfPages 得到总页数
pageIndicatorTintColor 未选中界面的颜色
currentPageIndicatorTintColor 选中界面的颜色
5.UITableViewController(表视图控制器)
5.1 是什么
是列表方式展示数据的一种VC。
5.2 在哪用
非常常见,有规律的展示固定样式的数据。
如果不用TableView,管理大量数据时:
1)手动布局,计算坐标
2)手动判断和事件处理
3)手动设置每一个控件的值
4)手动管理内存
5.3 能帮助我们干什么
管理布局,管理事件,有规律的展示数据,管理内存...
1.UITableViewController组成
UITableViewController中的View类型是UITableView。
+tableView : UITableView
+Table Header 表头
+Section 分区
+SectionHeader分区头
+Row行(Cell)
+SectionFooter分区尾
+Table Footer 表尾
表头、表尾、分区头、分区尾都可以没有。
TableView 有两种Style:
Plain: 普通Style,只有一个分区。
Group: 组,有多个分区。
2.UITableView两个委托
数据源 是TableView显示数据的来源。
.dataSource :id<UITableViewDataSource>
代理对象 处理一些数据源之外的其它事项,事件触发。
.delegate :id<UITableViewDelegate>
3.UITableView重的问题
三问:(显示)
a.你有几个分区
numberOfSectionsInTableView
b.每个分区有几行
numberOfRowsInSection
c.每行的内容是什么
cellForRowAtIndexPath
4.创建一个UITableViewController
使用步骤:(自动生成)
a.继承UITableViewController
b.实现三问
使用步骤:(xib手动生成)
a.创建UIViewController
b.拖拽一个UITableView到父视图中
c.将VC设置为被委托对象
<1>遵守协议(UITableViewDataSource)
<2>实现方法(三问)
<3>委托对象与被委托对象建立关联(连线)
使用步骤:(code手动生成)
a.创建UIViewController
b.手动创建UITableView对象(code)
c.将VC设置为被委托对象
<1>遵守协议(UITableViewDataSource)
<2>实现方法(三问)
<3>委托对象与被委托对象建立关联
(tv.dataSource= self)
5.多分区的使用
每个分区有几行 参数1:事件源 参数2:区分不同的分区
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
注:要将UITableView的Style改成Grouped。
6.区分多行 indexPath
NSIndexPath是一种集合(保存多维数组)描述数据关系。
用来存储路径。例:描述分区行->Cell
.section 描述哪个分区
.row 描述此分区的哪一行
7.模型层与View层的关联
8.UITableViewCell类
8.1 是什么
TableView中每一行就是一个UITableViewCell类型的对象。UITableView其实是UIView的子类,它是一个视图。
8.2 Cell中的属性
UITableViewCell视图有以下子视图
.textLabel : UILabel用于在Cell上显示文字内容
.detailTextLabel :UILabel 用于在Cell上显示详细内容
.imageView :UIImageView 用于图片
8.3 Cell显示的样式
Cell的style(系统提供的) initWithStyle
Default:默认,不显示详细信息
Value1:左右显示主要信息和详细信息,显示图片信息
Value2:居中显示详细信息,不显示图片信息
Subtitle:可以显示详细信息,详细信息另起一行
也可以自定义Cell
8.4 Cell的性能(Cell的重用)
(1)第一种重用方式
tableView在运行期间,出了界面的Cell并不会释放,而是放到了tableView中的队列中,所以,需要在创建Cell之前先试着从此队列中去拿已经存在的Cell对象,如果能拿到就不需要创建,而是重用Cell对象。
(2)***第二种重用方式
向tableView“注册”一个重用的Cell对象,注册后如果向tableView索要队列中的对象时,如果没有队列中没有空闲的Cell对象,tableView会自动帮我们创建一个并返回,这样可以确保dequeue方法一定会返回一个Cell对象供我们使用。
使用步骤:
<1>注册
- (void)viewDidLoad
{[self.tableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:CellIdenitifier]; }
<2>直接去队列里面取
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:CellIdenitifier];
8.5 一向应(答)
处理相应的事件方法。
遵守一个协议(UITableViewDelegate)
实现方法 didSelectRowAtIndexPath
例:点击某一个Cell,跳转到详细信息界面。
1)创建一个详细信息界面
2)传值
将选中Cell的信息传值给新的界面
3)push一个新的界面
1.如何向TableView中增加一行数据(反向传值)
当从第二个界面返回第一个界面时,将数据传回给当前界面的模型层,但是界面不会自动的刷新,需要手动通知tableView刷新界面(重新执行三问)。
在viewDidApear方法中
[self.tableViewreloadData];//全局刷新
//局部刷新
self.tableViewinsertRowsAtIndexPath:…
注:如果复用指定样式的Cell
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"Cell"];
if(cell== nil){
cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"];
}
2.tableView的编辑模式
2.1 是什么
可以向TableView中插入、删除、移动Cell的一种状态。 2.2 如何进行编辑模式
(1)UITableView有个属性editing(BOOL),将其值设置为YES会进行编辑模式,NO会退出编辑模式。
(2)如何删除和插入
两问一响应:
之两问:
<1>哪些行进行编辑模式:(默认是所有行)
-(BOOL)tableView:canEditRowAtIndexPath
<2>进入模式时,样式是什么样的:(默认是删除)
-(UITableViewCellEditingStyle)tableViewedtingStyleForRowAtIndexPath;
一响应:
commitEditingStyle:forRowAtIndexRow:
删除数据:
1)***先从模型层删除相应的数据
2)再从View层删除相应的数据
插入数据
1)***向模型层中插入相应的数据
2)在视图层添加相应的数据
(3)移动行
一问一响应(在编辑状态下 按住某行Cell进行移动)
一问:
哪些行可以移动(默认是所有行都可以移动)
-(BOOL)tableView:canMoveRowAtIndexPath:
一响应:
当用户进行移动时,调用哪个方法进行数据
-(void)tableView:moveRowAtIndexPath:toIndexPath;
操作步骤:
1.从model层,取出要移动的数据,将原来位置的数据删除掉
2.添加到新的位置 会自动刷新视图
1.UITableViewCell 高级
1.1 是什么
是视图,是UIView的子类。
1.2 组成
两大视图:
+contentView : UIView
+textLabel : UILabel
+detailLabel : UILabel
+imageView : UIImageView
+accessoryView : UIView
1.2 accessoryView
辅助视图,协助Cell实现一些界面效果,但默认是nil(没有辅助视图),当进入编辑模式下,辅助视图会默认隐藏。
1.3 如何使用
(1)是UIView属性,可以指向任何类型的视图
(2)系统提供4种已经定义好的辅助视图
accessoryType来指定:
DisclosureIndicator">"
提示用户点击此Cell有更详细的内容
DetailDisclosureButton"i"+">"
提示用户点击此按钮i也会有更详细的内容
Checkmark"√"
一个"√",相当于打了个标记
DetailButton"i"
仅仅提示用户点击此按钮,会显示内容
注:如果点击了辅助视图的按钮,会触发方法
tableView:accessoryButtonTappedForRowWithIndexPath
(3)除了使用系统定义好的辅助视图,还可以自定义辅助视图。
cell.accessoryView =view(任意视图)
(4)也可以自定义ContentView,定义的内容是ContentView的子视图
[cell.contentViewaddSubview:view];(任意视图)
注:如果自定义的是辅助视图,x,y坐标无效。
如果自定义的是内容视图,x,y坐标有效。
如果内容视图有值,自定义视图会将原来的内容视图挡住。
1.4 自定义分区头、分区尾信息
(1)可以设置文字
tableView:titleForHeaderInSection
tableView:titleForFooterInSection
(2)可以设置视图
viewForHeaderInSection
viewForFooterInSection
(3)在导航栏中也有相关属性可以通过view赋值
self.navigationItem.titleView
1.5 完全自定义Cell
有两种创建方式,一个code方式,一个是***xib方式。
(1)基本原理
UITableViewCell类是TableView的标准Cell类,自定义Cell就是自己写Cell类,然后在三问中最一个,“每一行的Cell”中回答,创建自定义的Cell。
(2)如何实现
借助xib文件的功能,创建自定义Cell的界面,然后和自定义的Cell类进行绑定即可。
(3)详细的实现步骤:
<1>创建一个Cell的类和xib文件
<2>向xib中添加相应的视图
<3>将xib中的视图与类的属性建立关联
<4>在tableView中的三问,最后一问中使用自定义Cell对象。
a.注册的方式 创建自定义的Cell
UINib *xib= [UINibnibWithNibName:@"TRTableViewCell"bundle:nil];
[self.tableViewregisterNib:xibforCellReuseIdentifier:Identifier];
b.在队伍当中取出自定义的Cell对象并使用
TRTableViewCell *cell = [self.tableViewdequeueReusableCellWithIdentifier:Identifier];
c.一定要设置自定义Cell的高度
heightForRowAtIndexPath
<5>配置Cell对象中显示的内容
1.6 TableView的使用
(1)静态(Static)的TableView
<1>是什么
程序员直接写死TableView中有多少分区、多少行、以及每行的内容是什么。
<2>如何使用静态的TableView
硬代码的方法回答所有问题。
if(区、行){ 就怎么样 }
else if(区、行){ 就怎么样 }
else { 就怎么样 } 或使用switch
<3>应用广泛
各种设置界面(不会)
展示一个对象的信息(会变),静态的TableView并不意味着Cell中的内容不会改变。
使用code与xib创建静态的TableView
注:Demo 显示内容使用静态TableView
Demo 显示的样式静态TableView但数据是动态
Demo 使用xib的Cell实现表态的TableView
操作步骤:
1.拖拽一个Cell视图到tableView所在的xib文件中。
2.将该Cell连线到相应的TableViewController中的属性。 3.在TableView的第三问中,直接回返回Cell对象属性。
注:如果需要设置Cell中的属性,参照自定义Cell。
(2)动态(Dynamic)的TableView
<1>是什么
TableView中有多少区、多少行、每行的内容是什么,都有数据模型层来决定,而不是写死的。
<2>灵活使用TableView
a.两个TableView使用相同的数据源
b.两个TableView使用不同的数据源
c.两个TableView使用不同的委托对象
1.UITabBarController(标签控制器)
1.1 是什么
类似于UINavigationConroller,也是一个控制器的控制器,经常看见的UITabBarController表现为UITabbar。(类似于NavigationController的UIToolBar)
1.2 如何使用
创建UITabBarController对象,.viewControllers =@[vc1,vc2,vc3,vc4];
如果多出4个以下的视图控制器,会自动在Tabbar上生成一个More视图。
1.3 重要的属性
设置VC的属性:(VC初始化的时候使用)
.title 文字
.tabBarItem 图片 默认是以单色显示
显示上的不同的内容
1.4 NavigationController和TabBarController一起使用
window->TabBarController->NavigationController->TableViewController->ViewController
2.UICollectionViewController
2.1 是什么
是一个展示大量数据的控制器,功能几乎与UITableViewController差不多,其实是UITableViewController的变种,是正真的二维表(多行多列)。
ios6以后支持的,用于展示视图、布局更加灵活,用法类似TableViewController。
2.2 使用
使用方式与UITableViewController
2.3 不同点
<1>UICollectionView是多行多列
<2>UICollectionView中的Cell一般需要"自定义"
UICollectionViewCell中没有定义
.textLabel
.detailLabel
.imageView等属性都没有,所以需要自定义。
分析:
tableView—属性—tableViewController
显示 UITableViewDataSource—方法
操作 UITableViewDelegate—方法
2.4 实现步骤
(1)创建一个VC(UIViewController)
(2)拖拽CollectionView到VC中(委托对象)
(3)设置被委托对象
<1>遵守协议
UICollectionViewDataSource
UICollectionViewDelegate
<2>实现方法
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
<3>委托对象与被委托建立关联
<4>自定义Cell(参考自定义TableViewCell)
a.创建一个类(UICollectionViewCell)
b.创建相应的xib文件(并自定义中的内容)
注:xib中的Cell与自定义的类进行关联
xib中的label应该是自定义的类属性(IBOutlet)
c.在CollectionView第三问中,使用自定义Cell。
(1)先注册 (2)再从队列中取出来并赋值
2.5 重要的属性
Cell Size:设置Cell的大小
Header/Footer Size:设置分区头/尾的大小
Min Spacing:设置Cell对象间(横)/行(竖) 间隔距离
Section Insets:内边距,Cell对象与边的距离,上、下、左、右。
2.6 CollectionView 可以布局类,进行布局,使用UIKit提供的布局(UICollectionViewFlowLayout),也可以自定义布局。
2.7CollectionView的一些常用属性
layout:Flow/Custom
如果选择Flow,Cell一个挨一个。
如果选择custom,需要指定一个布局类,此类一定是自定义的,并且继承UICollectionViewLayout。
ScrollDirection:滚动的方向,默认是垂直,也可以是水平的。
CollectionView是UIScrollView的子类,所以有PagingEnabled属性。
2.8 布局
<1>是什么
CollectionView是布局的精髓,相当于CollectionView的大脑和中枢,负责设置CollectionView的一些属性。
位置、尺寸、透明度、层级关系、形状...
<2>本质
本质就是对象,UICollectionViewLayout类的子类对象。
UIKit提供了一个布局类: UICollectionViewFlowLayout: UICollectionViewLayout,流式布局,一个挨一个。
<3>***自定义布局
写一个类,继承自UICollectionViewLayout或继承UICollectionViewFlowLayout,创建此类的对象,设置为collectionView的布局属性即可。
3.其它控件
3.1 UISegementedControl 分段控制选择
允许用户在多个分段中做出选择。
重要属性:
selectedSegmentIndex按钮的索引
重要事件:
valueChanged
3.2 Activity Indicator 活动指器
用来标识某个状态,活动或者空闲。
重要方法:
A.开始动画
startAnimating
B.停止动画
stopAnimating
3.3 ProgressView 进度条
用来显示任务的状态,文件下载的进度或邮件的读取速度。
重要属性:
.progressTintColor 进度条颜色
.tractTintColor 底颜色
.progress 值0.0~1.0 之间
备注:
NSTimer定时器
参数1:间隔时间 单位/秒
参数2:通知哪个对象
参数3:发送什么消息
参数4:nil
参数5:是否重复执行
NSTimer*timer = [NSTimer scheduledTimerWithInterval:1 target: select: userInfo:repeats:]
[timer invalidate];停止定时器的继续执行
3.4 UITextView 多行文本框
继承了UIScrollView,是一个可滚动的多行视图文本区域,可以格式化并且可以编辑。
重要属性:
.text 文本框的内容
.textColor 里面的字体颜色
.delegate 代理对象
.returnKeyType 返回按钮的类型
.scrollEnabled = YES是否可以拖动滚动条
重要方法:
… 参照 UITextField
3.5 DatePicker 日期选择器
重要属性:
.date 得到选中的日期对象
(UTC时间 NSDateFormatter)
.locale = [NSLocalealloc]initWithLocaleIdentifier:@"zh_CN"];
重要方法:
valueChanged
3.6 PickerView 视图选择器
允许用户从滚轮控件中选择数据,与TableView相似。
(1)数据源 UI……datasource…
数据源负责计算UIPickerView有多少列(滚轮的个数)、多少行(滚轮中数据的个数)。
返回总的列数:
返回总的行数:
(2)事件方法(Delegate)UI……delegate…
<1>第component列第row行显示样的View。(NSString)
<2>选择某一行时触发该事件方法
<3>返回component列每一行的高度
刷新某一列数据
[pickerViewreloadCompnent:1];
1.WebView 网页视图(浏览器控件)
可以实现一个Web浏览器,可以实现加载静态html,动态URL地址,可以实现网页导航,以及调用JavaScript等。
重要方法:
[self.myWebViewloadHTMLString:…. baseURL:nil];
2.UISearchBar搜索控件
按照指定要求 查找相应内容,通常与TableView结合使用。
2.1 谓词(NSPredicate)(正则表达式)
(1)是什么
用于定义一个逻辑判定,判定结果是一个BOOL。
(2)干什么
作为if语句的条件和数据筛选。
(3)使用
通过使用predicateWithFormat:来创建一个谓词对象。
2.2 搜索控件
实现步骤:
(1)搜索框的输入问题 UISearchBarDelegate
(2)将输入的内容要与模型层的数据进行筛选
谓词
(3)将符合条件的数据保存下来
遍历模型层 将符合条件的数据,保存起来
(4)将它显示在TableView中
3.UISearchBar+UISearchDisplayController
3.1 是什么
搜索显示控制器,继承于NSObject,非视图控制器,一个工具类。
3.2 干什么用
提供控制一个SearchBar和一个搜索结果tableView。
searchBar需要创建,添加到指定的视图,提供给搜索控制器。
搜索结果由tableView(由搜索控制器创建的)显示,需要指定delegate和datasource。
设置代理(委托)对象,实现委托协议中方法。
3.3 使用步骤
(1)创建一个TableView并显示
(2)拖拽一个searchBar
设置searchBar在被代理对象
得到筛选后的结果
(3)UISearchDisplayController
设置了***显示结果TableView的dataSource、delegate
将searchBar得到的筛选后的结果,显示在TableView2(UISearchDisplayController提供的TableView)中吧。