你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> iOS開發系列–UITableView全面解析

iOS開發系列–UITableView全面解析

編輯:關於IOS

在iOS開發中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似於微信、QQ、新浪微博等軟件基本上隨處都是UITableView。當然它的廣泛使用自然離不開它強大的功能,今天這篇文章將針對UITableView重點展開討論。今天的主要內容包括:

  UITableView有兩種風格:UITableViewStylePlain和UITableViewStyleGrouped。這兩者操作起來其實並沒有本質區別,只是後者按分組樣式顯示前者按照普通樣式顯示而已。大家先看一下兩者的應用:   1>分組樣式   UITableViewStyleGrouped1      UITableViewStyleGrouped2   2>不分組樣式   UITableViewStylePlain1       UITableViewStylePlain2   大家可以看到在UITableView中數據只有行的概念,並沒有列的概念,因為在手機操作系統中顯示多列是不利於操作的。UITableView中每行數據都是一個UITableViewCell,在這個控件中為了顯示更多的信息,iOS已經在其內部設置好了多個子控件以供開發者使用。如果我們查看UITableViewCell的聲明文件可以發現在內部有一個UIView控件(contentView,作為其他元素的父控件)、兩個UILable控件(textLabel、detailTextLabel)、一個UIImage控件(imageView),分別用於容器、顯示內容、詳情和圖片。使用效果類似於微信、QQ信息列表:   UITableViewCell1      UITableViewCell2   當然,這些子控件並不一定要全部使用,具體操作時可以通過UITableViewCellStyle進行設置,具體每個枚舉表示的意思已經在代碼中進行了注釋:   typedef NS_ENUM(NSInteger, UITableViewCellStyle) {     UITableViewCellStyleDefault,    // 左側顯示textLabel(不顯示detailTextLabel),imageView可選(顯示在最左邊)     UITableViewCellStyleValue1,        // 左側顯示textLabel、右側顯示detailTextLabel(默認藍色),imageView可選(顯示在最左邊)     UITableViewCellStyleValue2,        // 左側依次顯示textLabel(默認藍色)和detailTextLabel,imageView可選(顯示在最左邊)     UITableViewCellStyleSubtitle    // 左上方顯示textLabel,左下方顯示detailTextLabel(默認灰色),imageView可選(顯示在最左邊) }; 數據源 由於iOS是遵循MVC模式設計的,很多操作都是通過代理和外界溝通的,但對於數據源控件除了代理還有一個數據源屬性,通過它和外界進行數據交互。 對於UITableView設置完dataSource後需要實現UITableViewDataSource協議,在這個協議中定義了多種 數據操作方法,下面通過創建一個簡單的聯系人管理進行演示:   首先我們需要創建一個聯系人模型KCContact   KCContact.h   // //  Contact.h //  UITableView // //  Created by Kenshin Cui on 14-3-1. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import <Foundation/Foundation.h>   @interface KCContact : NSObject   #pragma mark 姓 @property (nonatomic,copy) NSString *firstName; #pragma mark 名 @property (nonatomic,copy) NSString *lastName; #pragma mark 手機號碼 @property (nonatomic,copy) NSString *phoneNumber;   #pragma mark 帶參數的構造函數 -(KCContact *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber;   #pragma mark 取得姓名 -(NSString *)getName;     #pragma mark 帶參數的靜態對象初始化方法 +(KCContact *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber; @end KCContact.m   // //  Contact.m //  UITableView // //  Created by Kenshin Cui on 14-3-1. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "KCContact.h"   @implementation KCContact   -(KCContact *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber{     if(self=[super init]){         self.firstName=firstName;         self.lastName=lastName;         self.phoneNumber=phoneNumber;     }     return self; }   -(NSString *)getName{     return [NSString stringWithFormat:@"%@ %@",_lastName,_firstName]; }   +(KCContact *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber{     KCContact *contact1=[[KCContact alloc]initWithFirstName:firstName andLastName:lastName andPhoneNumber:phoneNumber];     return contact1; }   @end 為了演示分組顯示我們不妨將一組數據也抽象成模型KCContactGroup   KCContactGroup.h   // //  KCContactGroup.h //  UITableView // //  Created by Kenshin Cui on 14-3-1. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import <Foundation/Foundation.h> #import "KCContact.h"   @interface KCContactGroup : NSObject   #pragma mark 組名 @property (nonatomic,copy) NSString *name;   #pragma mark 分組描述 @property (nonatomic,copy) NSString *detail;   #pragma mark 聯系人 @property (nonatomic,strong) NSMutableArray *contacts;   #pragma mark 帶參數個構造函數 -(KCContactGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts;   #pragma mark 靜態初始化方法 +(KCContactGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts;   @end KCContactGroup.m   // //  KCContactGroup.m //  UITableView // //  Created by Kenshin Cui on 14-3-1. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "KCContactGroup.h"   @implementation KCContactGroup     -(KCContactGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts{     if (self=[super init]) {         self.name=name;         self.detail=detail;         self.contacts=contacts;     }     return self; }   +(KCContactGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts{     KCContactGroup *group1=[[KCContactGroup alloc]initWithName:name andDetail:detail andContacts:contacts];     return group1; } @end 然後在viewDidLoad方法中創建一些模擬數據同時實現數據源協議方法:   KCMainViewController.m   // //  KCMainViewController.m //  UITableView // //  Created by Kenshin Cui on 14-3-1. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "KCMainViewController.h" #import "KCContact.h" #import "KCContactGroup.h"   @interface KCMainViewController ()<UITableViewDataSource>{     UITableView *_tableView;     NSMutableArray *_contacts;//聯系人模型 }   @end   @implementation KCMainViewController   - (void)viewDidLoad {     [super viewDidLoad];          //初始化數據     [self initData];          //創建一個分組樣式的UITableView     _tableView=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];          //設置數據源,注意必須實現對應的UITableViewDataSource協議     _tableView.dataSource=self;          [self.view addSubview:_tableView]; }   #pragma mark 加載數據 -(void)initData{     _contacts=[[NSMutableArray alloc]init];          KCContact *contact1=[KCContact initWithFirstName:@"Cui" andLastName:@"Kenshin" andPhoneNumber:@"18500131234"];     KCContact *contact2=[KCContact initWithFirstName:@"Cui" andLastName:@"Tom" andPhoneNumber:@"18500131237"];     KCContactGroup *group1=[KCContactGroup initWithName:@"C" andDetail:@"With names beginning with C" andContacts:[NSMutableArray arrayWithObjects:contact1,contact2, nil]];     [_contacts addObject:group1];                 KCContact *contact3=[KCContact initWithFirstName:@"Lee" andLastName:@"Terry" andPhoneNumber:@"18500131238"];     KCContact *contact4=[KCContact initWithFirstName:@"Lee" andLastName:@"Jack" andPhoneNumber:@"18500131239"];     KCContact *contact5=[KCContact initWithFirstName:@"Lee" andLastName:@"Rose" andPhoneNumber:@"18500131240"];     KCContactGroup *group2=[KCContactGroup initWithName:@"L" andDetail:@"With names beginning with L" andContacts:[NSMutableArray arrayWithObjects:contact3,contact4,contact5, nil]];     [_contacts addObject:group2];                    KCContact *contact6=[KCContact initWithFirstName:@"Sun" andLastName:@"Kaoru" andPhoneNumber:@"18500131235"];     KCContact *contact7=[KCContact initWithFirstName:@"Sun" andLastName:@"Rosa" andPhoneNumber:@"18500131236"];       KCContactGroup *group3=[KCContactGroup initWithName:@"S" andDetail:@"With names beginning with S" andContacts:[NSMutableArray arrayWithObjects:contact6,contact7, nil]];     [_contacts addObject:group3];               KCContact *contact8=[KCContact initWithFirstName:@"Wang" andLastName:@"Stephone" andPhoneNumber:@"18500131241"];     KCContact *contact9=[KCContact initWithFirstName:@"Wang" andLastName:@"Lucy" andPhoneNumber:@"18500131242"];     KCContact *contact10=[KCContact initWithFirstName:@"Wang" andLastName:@"Lily" andPhoneNumber:@"18500131243"];     KCContact *contact11=[KCContact initWithFirstName:@"Wang" andLastName:@"Emily" andPhoneNumber:@"18500131244"];     KCContact *contact12=[KCContact initWithFirstName:@"Wang" andLastName:@"Andy" andPhoneNumber:@"18500131245"];     KCContactGroup *group4=[KCContactGroup initWithName:@"W" andDetail:@"With names beginning with W" andContacts:[NSMutableArray arrayWithObjects:contact8,contact9,contact10,contact11,contact12, nil]];     [_contacts addObject:group4];               KCContact *contact13=[KCContact initWithFirstName:@"Zhang" andLastName:@"Joy" andPhoneNumber:@"18500131246"];     KCContact *contact14=[KCContact initWithFirstName:@"Zhang" andLastName:@"Vivan" andPhoneNumber:@"18500131247"];     KCContact *contact15=[KCContact initWithFirstName:@"Zhang" andLastName:@"Joyse" andPhoneNumber:@"18500131248"];     KCContactGroup *group5=[KCContactGroup initWithName:@"Z" andDetail:@"With names beginning with Z" andContacts:[NSMutableArray arrayWithObjects:contact13,contact14,contact15, nil]];     [_contacts addObject:group5];   }   #pragma mark - 數據源方法 #pragma mark 返回分組數 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{     NSLog(@"計算分組數");     return _contacts.count; }   #pragma mark 返回每組行數 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{     NSLog(@"計算每組(組%i)行數",section);     KCContactGroup *group1=_contacts[section];     return group1.contacts.count; }   #pragma mark返回每行的單元格 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{     //NSIndexPath是一個結構體,記錄了組和行信息     NSLog(@"生成單元格(組:%i,行%i)",indexPath.section,indexPath.row);     KCContactGroup *group=_contacts[indexPath.section];     KCContact *contact=group.contacts[indexPath.row];     UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];     cell.textLabel.text=[contact getName];     cell.detailTextLabel.text=contact.phoneNumber;     return cell; }   #pragma mark 返回每組頭標題名稱 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{     NSLog(@"生成組(組%i)名稱",section);     KCContactGroup *group=_contacts[section];     return group.name; }   #pragma mark 返回每組尾部說明 -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{     NSLog(@"生成尾部(組%i)詳情",section);     KCContactGroup *group=_contacts[section];     return group.detail; } @end
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved