看tableview的資料其實已經蠻久了,一直想寫點兒東西,卻總是因為各種原因拖延,今天晚上有時間靜下心來記錄一些最近學習的tableview的知識。下面進入正題,uitableview堪稱uikit里面最復雜的一個控件了,使用起來不算難,但是要用好并不容易。當使用的時候我們必須要考慮到后臺數據的設計,tableviewcell的設計和重用以及tableview的效率等問題。
上次介紹的uitableview,這里再做一個uitableview的小程序,汽車品牌,截圖如下:
1.1創建項目,這里不多講。
1.2 把所有汽車品牌的圖片放到images.xcassets中,如下圖:
1.3創建 plist數據,plist數據里面每個array為一個汽車品牌分組,每個array里面又有一個array,這里面存放每個分組下所有的品牌汽車數據,數據如下圖。
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 實現汽車品牌的全部內容,希望對大家有所幫助。