UITableView是一種“目錄檢視或叫表視圖”(英文名字table view),這種表視圖以列表的形式顯示或編輯資訊,它由一列、多行組成。使用者可以通過垂直滾動的方式導航到一個表視圖的任意行上,並可以自訂每一行資料的顯示方式。
在建立表視圖的時候,可以選擇兩種風格的表視圖:UITableViewStylePlain或者UITableViewStyleGrouped,前者是按索引進行排序的,而後者是按組進行分類顯示的。
基本上每一個UITableView都有相應的UITableViewController、UITableViewDelegate、UITableViewDataSource類。UITableViewController類作為UITableView的視圖控制類(MVC裡Controller的角色)負責管理UITableView,它和大多數UIViewController類一樣,控制著UITableView的生命週期函數。UITableViewDelegate作為委託模式裡的被委派物件的介面,和大多數iPhone委託介面一樣,它提供了UITableView子類無法在行為上保持一致的部分,在這裡讀者可以自訂表格視圖的顯示風格,甚至可以自訂表格視圖的每一個元素,它的重要介面定義如下:
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
@optional
// Display customization
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
// Variable height support
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
// Section header & footer information. Views are preferred over title should you decide to provide both
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
// Accessories (disclosures).
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
// Selection
// Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
// Called after the user changes the selection.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
// Editing
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
// Indentation
- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; // return depth of row for hierarchies
@end
UITableViewDataSource提供了表視圖的資料來源,下表列出了常見的表視圖資料來源方法:
Method
Description
tableView:numberOfRowsInSection:
特定Section內的行數
numberOfSectionsInTableView:
特定資料來源的表視圖的Section數目
tableView:cellForRowAtIndexPath:
從資料來源擷取儲存格內容並放到特定的行上
sectionIndexTitlesForTableView:
擷取一個資料來源的表視圖的標題
tableView:commitEditingStyle:forRowAtIndexPath
提交儲存格內容的修改
talbeView:canEditRowAtIndexPath:
通過返回一個Boolean類型的值來通知表視圖某一行能否修改
tableView:canMoveRowAtIndexPath:
通過返回一個Boolean類型的值來通知表視圖某一行能否被移動
tableView:moveRowAtIndexPath:toIndexPath:
允許某一個表視圖儲存格被移動
表視圖資料來源介面提供了表視圖資料來源操作的常用方法,其中tableView:numberOfRowsInSection和tableView:cellForRowAtIndexPath:是每一個表試圖的資料來源必須實現的兩個方法,前者告訴表視圖內有多少行儲存格,而後者告訴表視圖每一個儲存格的內容是什麼。程式通過實現這兩個方法,可以提供一個表視圖所需要的基本資料並供表視圖調用。
筆者在下面的例子裡會編寫一個帶導航面板的表視圖,這種複雜類型的控制項在iPhone中隨處可見,如iPod程式、備忘錄程式、鬧鐘程式等。
ü 首先,建立一個“Window-based”項目並命名為“TableProjectOne”。
ü 建立一個UIViewController的子類,並命名為“MyViewController”。
ü 建立一個空的xib並命名為“MyViewController”。
ü 在Interface Build中開啟MyViewController.xib。
ü 從Library裡拖拉一個view到MyViewController的視窗中,然後再添加一個table view到新添加的view下,確保table view完全填充view。
ü 修改File’s Owner為MyViewController,串連MyViewController的view到上面新添加的view上。
ü 到這裡MyViewController建立完畢,儲存並退出Interface Build。
ü 開啟MainWindow.xib並拖拉一個Navigation Controller到視窗中。
ü 拖拉一個View Controller到Navigation Controller下,改變它的類名和Nib名為MyViewController。
ü 拖拉一個Bar Button Item到Navigation Controller上,並改title為“view2”。
修改TableProjectOneAppDelegate.h檔案如下:
#import <UIKit/UIKit.h>
#import "MyViewController.h"
@interface TableProjectOneAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
IBOutlet UINavigationController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *viewController;
@end
實現檔案TableProjectOneAppDelegate.m如下:
#import "TableProjectOneAppDelegate.h"
@implementation TableProjectOneAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window addSubview:self.viewController.view];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
- (void)dealloc {
[window release];
[viewController release];
[super dealloc];
}
@end
最終實現的效果如下: