標籤:
這是UITableView部落格系列的第一篇,使用xib和arc編碼,主要講解一些UITableView使用過程中簡單的、但是又容易被忽略的東西,而且我會告訴讀者,怎樣在使用了之後就再也不會忘記。
操作的步驟如下,
(1)首先拖一個UITableView控制項到xib檔案上面,如,
這沒有什麼,大家不要太過於害怕UITableView,它只是一個UI控制項,跟UIButton和UILabel沒什麼不一樣,可以隨意的拖拉。
(2)接下來我們在對應的xxxViewController中執行個體化這個UITableView對象,這裡有一個小技巧需要說明一下,先點擊xxxViewController.xib檔案,這時候Xcode中顯示的就是xib檔案的內容,這時候雙擊xxxViewController.h檔案,這時候在小視窗中開啟了.h檔案,這樣就方便了下面的操作。
在xxxViewController.xib檔案中點,擊TableView,點擊滑鼠右鍵,將其拖動到小視窗的xxxViewController.h檔案中,如,
(3)釋放滑鼠,這時候會彈出下面的介面,
這裡我將UITableView對象命名為theTableView,你可以將其命名為任意的名字,這隻是一個變數名稱,任意你修改。點擊Connect按鈕,這樣Xcode自動幫我們在xxxViewController.h檔案中產生了property聲明,
?
| 1 |
@property (nonatomic, strong) IBOutlet UITableView *theTableView; |
這就是使用xib的好處,節省了很多代碼,不是嗎?
(4)這一步驟很重要,設定theTableView的delegate和dataSource為self,在xxxViewController.xib檔案中,右鍵拖動滑鼠指向File‘s Owner,如,
接著會彈出下面的介面,
先點擊dataSource,再重複上面的操作,然後點擊delegate。這樣的介面操作,相當於執行了self.theTableView.delegate = self;和self.theTableView.dataSource = self;語句。我還是要提醒一下,要兩次右鍵拖動UITableView指向File‘s Owner,分別設定dataSource和delegate,順序隨便。
(5)上面都是通過xib來設定介面的,這樣省去了不少代碼,我說明了操作的過程。好了,xib拖動基本就是這麼多內容,下面是代碼實現的細節。
在xxxViewController.m檔案中,實現UITableViewControllerDelegate和UITableViewControllerDataSource協議,並且定義一個NSMutableArray執行個體變數instance variable,命名為_infoArray,
?
| 12345 |
@interface xxxViewController()<UITableViewDelegate,UITableViewDataSource>{ NSMutableArray *_infoArray;}@end |
在-viewDidLoad中初始化_infoArray數組內容,
?
| 12345 |
- (void)viewDidLoad{ [super viewDidLoad]; _infoArray = [[NSMutableArray alloc] initWithObjects:@"Zero",@"One",@"Two",@"Three",@"Four", nil];} |
好了,這個步驟就是設定theTableView的資料來源,有人會問資料來源是什麼,簡單來說資料來源就是這個theTableView控制項要顯示的內容,就像label.text = @"Label內容";,其中@"label內容"字串就是label控制項的資料來源。所以我們可以看到,UITableView是完美的使用了MVC設計模式來實現的,其中xxxViewController擔任控制者的角色,theTableView是視圖,而這裡的_infoArray是資料來源,實際上這裡的_infoArray並不是完整的資料模型,還可以進行更高層次的抽象。
(6)上面我們服從了UITalbeViewDelegate和UITableViewDataSource協議,那麼我們就需要在xxxViewController中區實現協議中的代理方法,那麼有讀者會問,UITableView有那麼多的代理方法,我總是記不清楚,這裡我將告訴你怎麼記得清楚,以後也不會遺忘。
在所有的UITableView代理方法中,返回列表行數(NSInteger)和設定列表內容(UITableViewCell *)是必不可少的兩個代理方法,這兩個方法的傳回值分別是NSInteger和UITableViewCell *內容,所以我們只需要記住傳回值,然後Xcode就會自動提示我們需要選擇哪個方法,
例如我想實現返回列表行數的方法,這時候只需要輸入- (NSInteger)tableView,這時候Xcode會提示我們很多的方法,如所示,
這時候我選擇第二個numberOfRowsInSection:(NSInteger)section方法,然後在裡面返回_infoArray的數組個數,如下代碼所示,
?
| 1234 |
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [_infoArray count];} |
這樣就設定了返回的行數。
接下來我要設定列表顯示的內容,我們知道它的傳回值為UITableViewCell *類型,所以我直接這樣寫,- (UITableViewCell *)tableView,Xcode自動提示我完整的代理方法,如所示,
很幸運,返回UITableViewCell *內容的方法只有一個,我不用選擇直接按Enter按鍵就可以了,接著我來實現cellForRowAtIndexPath:(NSIndexPath *)indexPath方法,填充裡面的內容,如下代碼,
?
| 1234567891011 |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *simpleIdentify = @"SimpleIdentify"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleIdentify]; if(cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleIdentify]; } cell.textLabel.text = [_infoArray objectAtIndex:indexPath.row]; return cell;} |
上面的代碼全都是我手寫輸入的,因為我已經記得滾瓜爛熟了,算是孰能生巧吧,所以iOS開發,對於一些關鍵代碼,為了不重複查閱資料,還是要用心記下來的。那麼怎樣記憶上面簡單但是又容易遺忘的代碼呢?我來說說我的記憶過程吧,首先static NSString *simpleIdentify = @"SimpleIdentify";是設定UITableViewCell的重用標識符,我們知道UITableView的重用機制比較牛逼的技術,這個以後我會寫部落格來說明的,這裡不再多說。接下來我輸入代碼UITableViewCell *cell = [tableView de];這時候Xcode會自動提示方法列表,如,
記住,這裡請選擇第一個dequeueReusableCellWithIdentifier方法,該方法只有一個NSString *參數,我之前很多次選擇了第二個方法,然後程式莫名其妙地cursh了。
接著通過if(cell == nil){}來判斷cell是否為空白,如果cell為空白,則執行個體化cell對象,代碼是cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleIdentify];
然後通過cell.textLabel.text = [_infoArray objectAtIndex:indexPath.row];來設定cell顯示的資料來源中對應函數的內容,最後通過return cell;返回cell內容。
寫完這些代碼,我們運行程式,如下,
好了,這就是UITableView的系列一教程,主要是說明通過xib編碼,有哪些關鍵的步驟;還有幾十怎樣快速記住UITableView的代理方法。
iOS深入學習(UITableView:系列1-最基本的東西)