码迷,mamicode.com
首页 > 移动开发 > 详细

030-UITableView(1)-iOS笔记

时间:2015-10-08 22:48:21      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

学习目标

1.【了解】什么是UITableView

2.【理解】UITableView的数据源

3.【理解】UITableView的代理

一、什么是UITableView

在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView。UITableView继承自UIScrollView,所以它支持也只支持纵向滑动,以下app都是UITableView的使用案例:

技术分享

UITableView有两种风格,分别是Plain和Grouped。也就是UITableViewStylePlainUITableViewStyleGrouped,其中左边的是Plain风格的,右边的是Grouped风格,这个区别还是很明显的。

技术分享

UITableView有两个Delegate分别为:dataSource和delegate。

dataSourceUITableViewDataSource类 型,主要为UITableView提供显示用的数据(UITableViewCell),指定UITableViewCell支持的编辑操作类型 (insert,delete和reordering),并根据用户的操作进行相应的数据更新操作,如果数据没有更具操作进行正确的更新,可能会导致显示 异常,甚至crush。

delegateUITableViewDelegate类型,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示以及协助完成cell的删除和排序等功能。

提到UITableView,就必须的说一说NSIndexPath。UITableView声明了一个NSIndexPath的类别,主要用来标识当前cell的在tableView中的位置,该类别有section和row两个属性,前者标识当前cell处于第几个组中,后者代表在该组中的第几行。

二、UITableView的数据源

UITableView如果没有数据也就只是一个空壳,如果我们需要在UITableView中展示数据,必须为其指定数据源。也就是为UITableView的dataSource属性赋值一个遵守了UITableViewDataSource协议的OC对象。UITableView会向数据源查询一共有多少行数据以及每一行显示什么数据等。

技术分享

让UITableView展示数据的一般步骤:

1.让类遵守<UITableViewDataSource>协议。

2.实现协议中的必要方法。

3.指定数据源对象。

下面以一个简单的例子演示UITableView展示数据步骤,下图是完成后的界面截图:

技术分享

创建项目导入plist文件,并创建对应模型类。

cars_simple.plist

JFCar.h

JFCar.m

Main.storyboard中拖拽一个UITableView控件拉满这个屏幕,并进行属性连线操作。

技术分享

声明一个属性用于存储模型对象数组,并懒加载模型对象数组数据。

让当前控制器ViewController遵守<UITableViewDataSource>协议,并实现必要方法,最后为UITableView指定数据源对象。为了展示方便,我们重写prefersStatusBarHidden隐藏状态栏。

ViewController.m

iOS开发是遵循MVC设计思想的,我们需要对cell进行封装。因为cell是用来展示数据的,所以我们需要封装cell为视图类,继承自UITableViewCell

JFCarCell.h

JFCarCell.m

ViewController.m

 

三、UITableView的代理

开发中通常都要为UITableView设置代理对象(delegate),监听UITableView触发某个事件时做出相应的处理,比如选中了某一行。凡是遵守了UITableViewDelegate协议的OC对象,都可以是UITableView的代理对象。

下面通过一个简单的实例来演示UITableView代理(delegate)的作用。如下图所示:

技术分享

创建项目,在Main.storyboard中拖拽一个满屏的UITableView控件并进行属性控件连续,然后导入plist文件创建模型类。

技术分享

JFHero.h

JFHero.m

封装cell,提供一个快速创建cell的方法并实现cell的重用,再提供一个为cell属性赋值的方法。这里使用的是将模型对象定义为属性,并重写set方法为cell的属性赋值。

JFHeroCell.h

JFHeroCell.m

1.在控制器定义一个模型对象数组属性,并重新属性的get方法实现懒加载。

2.遵守UITableViewDataSource数据源协议、UITableViewDelegate代理协议、UIAlertViewDelegate对话框代理协议。

3.实现各种代理方法,并为UITableView指定数据源对象、代理对象为当前控制器。为UIAlertView指定代理对象为当前控制器。

具体代码如下

ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#import "ViewController.h"
#import "JFHero.h"
#import "JFHeroCell.h"
 
@interfaceViewController()<UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>
 
@property(strong,nonatomic)NSArray*heros;//声明模型对象数组
@property(weak,nonatomic)IBOutletUITableView*tableView;
 
@end
 
@implementationViewController
 
//隐藏状态栏
-(BOOL)prefersStatusBarHidden{
    returnYES;
}
 
//懒加载
-(NSArray*)heros{
    if(_heros==nil){
        //调用类方法返回模型数组
        _heros=[JFHeroheros];
    }
    return_heros;
}
 
-(void)viewDidLoad{
    [superviewDidLoad];
    
    //指定数据源对象
    self.tableView.dataSource=self;
    
    //指定代理对象
    self.tableView.delegate=self;
    
}
 
-(void)didReceiveMemoryWarning{
    [superdidReceiveMemoryWarning];
}
 
//一共有多少组
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{
    return1;
}
 
//每组多少行
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{
    
    returnself.heros.count;
}
 
//每行如何显示
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
    
    //创建cell
    JFHeroCell*cell=[JFHeroCell heroCell:tableView];
    
    //为cell赋值
    cell.hero=self.heros[indexPath.row];
    
    returncell;
}
 
//当点击了某行的时候触发
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
    //取出当前行的模型对象
    JFHero*hero=self.heros[indexPath.row];
    
    //创建对话框
    UIAlertView*alert=[[UIAlertViewalloc] initWithTitle:@"修改操作" message:@"请输入新的姓名" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
    
    //设置对话框的样式
    alert.alertViewStyle=UIAlertViewStylePlainTextInput;
    
    //获取当前模型对象的name赋值给对话框
    [alert textFieldAtIndex:0].text=hero.name;
    
    //添加一个清除文本框按钮
    [alert textFieldAtIndex:0].clearButtonMode=UITextFieldViewModeWhileEditing;
    
    //把行赋值给对话框的tag
    alert.tag=indexPath.row;
    
    //显示对话框
    [alert show];
    
}
 
//监听对话框点击选项
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    
    //点击了确认
    if(buttonIndex==1){
        
        //获取当前行的模型对象
        JFHero*hero=self.heros[alertView.tag];
        
        //重新为模型对象赋值
        hero.name=[alertView textFieldAtIndex:0].text;
        
        //封装要刷新的具体某组某行
        NSIndexPath*path=[NSIndexPath indexPathForRow:alertView.tag inSection:0];
        
        //刷新指定某组某行数据
        [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationBottom];
        
    }
}
 
@end

 

 
 
 

030-UITableView(1)-iOS笔记

标签:

原文地址:http://www.cnblogs.com/liehuntianshi/p/4862437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!