UITableView是app開發中經常使用到的控件,功能很強大,多用於數據的顯示。下面以一個簡單的實例來介紹tableview的基本用法。數組
@interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{服務器
UITableView *DataTable;app
NSMutableArray *dataArray1; //定義數據數組1spa
NSMutableArray *dataArray2;//定義數據數組2.net
NSMutableArray *titleArray;//定義標題數組設計
}接口
- (void)viewDidLoad圖片
{開發
[superviewDidLoad];get
//初始化tableview
DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];//指定位置大小
[DataTablesetDelegate:self];//指定委託
[DataTablesetDataSource:self];//指定數據委託
[self.viewaddSubview:DataTable];//加載tableview
dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];//初始化數據數組1
dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];//初始化數據數組2
titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];//初始化標題數組
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
//每一個section顯示的標題
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
switch (section) {
case 0:
return [titleArray objectAtIndex:section];//提取標題數組的元素用來顯示標題
case 1:
return [titleArray objectAtIndex:section];//提取標題數組的元素用來顯示標題
default:
return @"Unknown";
}
}
//指定有多少個分區(Section),默認爲1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [titleArray count];//返回標題數組中元素的個數來肯定分區的個數
}
//指定每一個分區中有多少行,默認爲1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
switch (section) {
case 0:
return [dataArray1 count];//每一個分區一般對應不一樣的數組,返回其元素個數來肯定分區的行數
break;
case 1:
return [dataArray2 count];
break;
default:
return 0;
break;
}
}
//繪製Cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
//初始化cell並指定其類型,也可自定義cell
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[[UITableViewCellalloc]
initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier] autorelease];
}
switch (indexPath.section) {
case 0://對應各自的分區
[[cell textLabel] setText:[dataArray1 objectAtIndex:indexPath.row]];//給cell添加數據
break;
case 1:
[[cell textLabel] setText:[dataArray2 objectAtIndex:indexPath.row]];
break;
default:
[[cell textLabel] setText:@"Unknown"];
}
return cell;//返回cell
}
tableview還有不少高難度的屬性和接口,在之後我會慢慢補齊。
上面的例子在功能上介紹了tableview的使用,但其在數據處理上具備很大的侷限性。當咱們要從服務器上請求數據,面對多種可能的數據(主要指數組的個數不穩定)此時上面的switch將沒法知足咱們的需求了。
使用switch但是代碼的結構清晰明瞭,但其侷限性很致命(switch中case的個數沒法動態指定),下面的另外一種方法可解決上述問題。
代碼在起因基礎上進行的修改:
@interface TableViewTestViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{
UITableView *DataTable;
NSMutableArray *dataArray1;
NSMutableArray *dataArray2;
NSMutableArray *titleArray;
NSMutableArray *dataArray; //加入了用於保存數組的數組 dataArray
}
- (void)viewDidLoad
{
[superviewDidLoad];
DataTable = [[UITableViewalloc] initWithFrame:CGRectMake(0, 0, 320, 420)];
[DataTablesetDelegate:self];
[DataTablesetDataSource:self];
[self.viewaddSubview:DataTable];
dataArray1 = [[NSMutableArrayalloc] initWithObjects:@"中國", @"美國", @"英國", nil];
dataArray2 = [[NSMutableArrayalloc] initWithObjects:@"黃種人", @"黑種人", @"白種人", nil];
titleArray = [[NSMutableArrayalloc] initWithObjects:@"國家", @"種族", nil];
dataArray = [[NSMutableArrayalloc] initWithObjects:dataArray1, dataArray2, nil]; //初始化dataArray,元素爲數組
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
//制定個性標題,這裏經過UIview來設計標題,功能上豐富,變化多。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *view = [[[UIViewalloc] initWithFrame:CGRectMake(0, 0, 320, 40)] autorelease];
[view setBackgroundColor:[UIColorbrownColor]];//改變標題的顏色,也可用圖片
UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(5, 5, 100, 30)];
label.textColor = [UIColorredColor];
label.backgroundColor = [UIColorclearColor];
label.text = [titleArrayobjectAtIndex:section];
[view addSubview:label];
return view;
}
//指定標題的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 40;
}
//每一個section顯示的標題,有了上面的這個就不要了
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
}
//指定有多少個分區(Section),默認爲1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [titleArraycount];
}
//指定每一個分區中有多少行,默認爲1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
/* switch (section) {
case 0:
return [dataArray1 count];
break;
case 1:
return [dataArray2 count];
break;
default:
return 0;
break;
}*/
/* for(int i = 0; i < [titleArray count]; i++){
if(section == i){
return [[dataArray objectAtIndex:section] count];
}
}*/
//上面的方法也是可行的,你們參考比較下
return [[dataArray objectAtIndex:section] count]; //取dataArray中的元素,並根據每一個元素(數組)來判斷分區中的行數。
}
//繪製Cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = (UITableViewCell*)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[[UITableViewCellalloc]
initWithFrame:CGRectZero
reuseIdentifier:CellIdentifier] autorelease];
}
/*switch (indexPath.section) {
case 0:
[[cell textLabel]
setText:[dataArray1 objectAtIndex:indexPath.row]];
break;
case 1:
[[cell textLabel]
setText:[dataArray2 objectAtIndex:indexPath.row]];
break;
default:
[[cell textLabel]
setText:@"Unknown"];
}*/
//上面的方法也可行,你們比較下。
[[cell textLabel] setText:[[dataArrayobjectAtIndex:indexPath.section]objectAtIndex:indexPath.row]];
//同上,取出dataArray中每一個分區所對應的元素(數組),並經過其來取值。 (你們要有想像力, 複製代碼試試就明白了)
return cell;
}
//改變行的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return40;
}