服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - UITableView 实现汽车品牌(demo)

UITableView 实现汽车品牌(demo)

2020-12-22 16:25apecoder IOS

UITableView堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易,当使用的时候我们必须要考虑到后台数据的设计,tableViewCell的设计和重用以及tableView的效率等问题,下面小编通过UITableView 实现汽车品牌,需要的

看tableview的资料其实已经蛮久了,一直想写点儿东西,却总是因为各种原因拖延,今天晚上有时间静下心来记录一些最近学习的tableview的知识。下面进入正题,uitableview堪称uikit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易。当使用的时候我们必须要考虑到后台数据的设计,tableviewcell的设计和重用以及tableview的效率等问题。

上次介绍的uitableview,这里再做一个uitableview的小程序,汽车品牌,截图如下:

UITableView 实现汽车品牌(demo)

1.1创建项目,这里不多讲。

1.2 把所有汽车品牌的图片放到images.xcassets中,如下图:

UITableView 实现汽车品牌(demo)

1.3创建 plist数据,plist数据里面每个array为一个汽车品牌分组,每个array里面又有一个array,这里面存放每个分组下所有的品牌汽车数据,数据如下图。

UITableView 实现汽车品牌(demo)

1.4数据创建完之后,然后设计页面,页面很简单,直接放一个uitable view就可以了。

2.1后台代码,第一步导入

?
1
<uitableviewdatasource,uitableviewdelegate,uialertviewdelegate>

只有导入这uitable view的这几个代理,我们才能在后面的代码中使用uitable view的一些相对应的方法。

2.2 创建uitable view控件的属性,和创建一个存储数据的数组,如下。

 

?
1
2
@property (weak, nonatomic) iboutlet uitableview *tableview;
@property(nonatomic,strong)nsarray *cargroups;

2.3 加载数据,这边先要创建两个模型类来保存数据,国为我们这里的数据都在本地的plist文化中,所以我们要把这个plist里面的数据读取出来保存在

创建的cargroups数组中,而本地的plist文件是一个array类型,而每个array里面又有一个array数组,所以我们要创建两个模型类来保存数据,一个模型类保存外面的array数据,一个模型类来保存array里面的子array数据,然后在模型类里面创建和plist里面对应的数据的属性和方法 

代码如下:

?
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
#import <foundation/foundation.h>
@interface zkcarmodel : nsobject
//头像
@property(nonatomic,copy)nsstring * icon;
//名字
@property(nonatomic,copy)nsstring *name;
+(instancetype)carwithdict:(nsdictionary *)dic;
-(instancetype)initwithdict:(nsdictionary *)dic;
@end
 
#import "zkcarmodel.h"
@implementation zkcarmodel
-(instancetype)initwithdict:(nsdictionary *)dic
{
 if(self=[super init])
 {
 [self setvaluesforkeyswithdictionary:dic];
 }
 return self;
}
+(instancetype)carwithdict:(nsdictionary *)dic
{
 return [[self alloc] initwithdict:dic];
}
@end
#import <foundation/foundation.h>
#import "zkcarmodel.h"
@interface zkcargroupmodel : nsobject
//题目
@property(nonatomic,copy)nsstring *title;
@property(nonatomic,strong)nsarray *cars;
+(instancetype)cargroupwithdic:(nsdictionary *)dic;
-(instancetype)initwithdict:(nsdictionary *)dic;
@end
 
#import "zkcargroupmodel.h"
@implementation zkcargroupmodel
-(instancetype)initwithdict:(nsdictionary *)dic
{
 if(self=[super init])
 {
 self.title=dic[@"title"];
 nsmutablearray *array=[nsmutablearray array];
 for (nsdictionary *dict in dic[@"cars"]) {
 zkcarmodel *car=[zkcarmodel carwithdict:dict];
 [array addobject:car];
 }
 self.cars=array;
 }
 return self;
}
+(instancetype)cargroupwithdic:(nsdictionary *)dic
{
 return [[self alloc] initwithdict:dic];
}
@end

2.4,对应数据的模型类创建好以后,开始创建数组懒加载

代码如下:

?
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
#import <foundation/foundation.h>
@interface zkcarmodel : nsobject
//头像
@property(nonatomic,copy)nsstring * icon;
//名字
@property(nonatomic,copy)nsstring *name;
+(instancetype)carwithdict:(nsdictionary *)dic;
-(instancetype)initwithdict:(nsdictionary *)dic;
@end
 
#import "zkcarmodel.h"
@implementation zkcarmodel
-(instancetype)initwithdict:(nsdictionary *)dic
{
 if(self=[super init])
 {
 [self setvaluesforkeyswithdictionary:dic];
 }
 return self;
}
+(instancetype)carwithdict:(nsdictionary *)dic
{
 return [[self alloc] initwithdict:dic];
}
@end
#import <foundation/foundation.h>
#import "zkcarmodel.h"
@interface zkcargroupmodel : nsobject
//题目
@property(nonatomic,copy)nsstring *title;
@property(nonatomic,strong)nsarray *cars;
+(instancetype)cargroupwithdic:(nsdictionary *)dic;
-(instancetype)initwithdict:(nsdictionary *)dic;
@end
 
#import "zkcargroupmodel.h"
@implementation zkcargroupmodel
-(instancetype)initwithdict:(nsdictionary *)dic
{
 if(self=[super init])
 {
 self.title=dic[@"title"];
 nsmutablearray *array=[nsmutablearray array];
 for (nsdictionary *dict in dic[@"cars"]) {
 zkcarmodel *car=[zkcarmodel carwithdict:dict];
 [array addobject:car];
 }
 self.cars=array;
 }
 return self;
}
+(instancetype)cargroupwithdic:(nsdictionary *)dic
{
 return [[self alloc] initwithdict:dic];
}
@end

2.5,数据加载完以后,然后就要开始写uitable view中相对应的代理方法了

代码如下:

?
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
//设置分区
-(nsinteger)numberofsectionsintableview:(uitableview *)tableview
{
 return self.cargroups.count;
}
//设置每个分区显示多少行数据
-(nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section
{
 zkcargroupmodel *model=self.cargroups[section];
 return model.cars.count;
}
//每行显示的数据
-(uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
{
 static nsstring *id=@"a";
 //从缓存中读取cell
 uitableviewcell *cell=[tableview dequeuereusablecellwithidentifier:id];
 //如果缓存中没有cell,创建一个新的cell
 if(cell==nil){
 cell=[[uitableviewcell alloc] initwithstyle:uitableviewcellstylesubtitle reuseidentifier:id];
 }
 //找到当前分区的索引
 zkcargroupmodel *groupmodel=self.cargroups[indexpath.section];
 //找到当前分区的行
 zkcarmodel *carmodel=groupmodel.cars[indexpath.row];
 //设置cell显示的文字
 cell.textlabel.text=carmodel.name;
 //设置cell显示的图片
 cell.imageview.image=[uiimage imagenamed:carmodel.icon];
 return cell;
}

上面3个代理方法是uitable view中最常用的3个方法。写完这3个方法运行xcode就可以看到数据了。

但这里还有些小问题,这里显示的所有品牌都是从上往下排的,没有一个分组,这样我们想找哪个品牌的汽车并不太好找,所以,我们要把同一个数据的汽车品牌加一个字母表示,这怎么做呢,这就要给uitable view的每个分区加一个头了,使用titleforheaderinsection代理方法

代码如下:

?
1
2
3
4
5
6
7
8
9
//设置头样式
-(nsstring *)tableview:(uitableview *)tableview titleforheaderinsection:(nsinteger)section
{
 //找到当前分区在数组中的索引
 zkcargroupmodel *model=self.cargroups[section];
 
 //返回当前分区的数据中的title
 return model.title;
}

2.6上面的程序中,在屏幕的最右边还有一个索引,点这个索引就找找到相对应的分区数据,其实这个也很简单,也是调用一个

sectionindextitlesfortableview的代理方法,这个方法返回一个array的数组。

代码如下:

?
1
2
3
4
5
//设置索引
-(nsarray *)sectionindextitlesfortableview:(uitableview *)tableview
{
 return [self.cargroups valueforkeypath:@"title"];
}

2.7,这个程序中还做了一个当你点击屏幕上每个汽车品牌的时候还会弹出一个对话框,为什么要做这个呢,因为很多时候屏幕上的图片和文字都是可以点击的,所以光做一个静态显示好不是很好,虽然这个对话框好像并没有什么用,但这里只是讲下这个方法的使用

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
//点击cell时变化
-(void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath
{
 //创建对话框
 uialertview *alertview=[[uialertview alloc] initwithtitle:@"汽车" message:@"取消" delegate:self cancelbuttontitle:@"确认" otherbuttontitles:@"取消", nil];
 //设置样式
 alertview.tag=1;
 alertview.alertviewstyle=uitableviewcellstylesubtitle;
 //[alertview ];
 
 [alertview show];
}

3.1 一个uitableview做的汽车品牌就这样ok了,虽然这并不是一个app但,这里已经把uitableview的一些常用代理方法都写到了,当然uitableview还有很多代表方法,这里并没有讲,但会了这些以后,在以后的使用中我们可以再来查询,重要的是思想。

以上是uitableview 实现汽车品牌的全部内容,希望对大家有所帮助。

延伸 · 阅读

精彩推荐
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5272021-01-16
  • IOS详解iOS中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26