iOS編程中的UITableView詳解(數(shù)據(jù)源dataSource)

一稠曼、UITableView基本介紹

iOS開發(fā)中UITableView可以說是使用最廣泛的控件芥丧,我們平時(shí)使用的軟件中到處都可以看到它的影子刁绒,微信闷营、QQ、新浪微博等軟件基本都有UITableView知市。
UITableView有兩種style:
UITableViewStylePlain


232318440491185.png

UITableViewStyleGrouped傻盟。


image.png

UITableView中數(shù)據(jù)只有行的概念,并沒有列的概念嫂丙,因?yàn)樵谑謾C(jī)操作系統(tǒng)中顯示多列是不利于操作的娘赴。UITableView中每行數(shù)據(jù)都是一個(gè)UITableViewCell,在這個(gè)控件中為了顯示更多的信息跟啤,iOS已經(jīng)在其內(nèi)部設(shè)置好了多個(gè)子控件以供開發(fā)者使用诽表。如果我們查看UITableViewCell的聲明文件可以發(fā)現(xiàn)在內(nèi)部有一個(gè)UIView控件(contentView,作為其他元素的父控件)隅肥、兩個(gè)UILable控件(textLabel竿奏、detailTextLabel)、一個(gè)UIImage控件(imageView)腥放,分別用于容器泛啸、顯示內(nèi)容、詳情和圖片捉片。不同的UItableViewCell不同的類型:

typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,    // 左側(cè)顯示textLabel(不顯示detailTextLabel)平痰,imageView可選(顯示在最左邊)
    UITableViewCellStyleValue1,        // 左側(cè)顯示textLabel汞舱、右側(cè)顯示detailTextLabel(默認(rèn)藍(lán)色)伍纫,imageView可選(顯示在最左邊)
    UITableViewCellStyleValue2,        // 左側(cè)依次顯示textLabel(默認(rèn)藍(lán)色)和detailTextLabel,imageView可選(顯示在最左邊)
    UITableViewCellStyleSubtitle    // 左上方顯示textLabel昂芜,左下方顯示detailTextLabel(默認(rèn)灰色),imageView可選(顯示在最左邊)
};
數(shù)據(jù)源dataSource

UITableView設(shè)置完dataSource后需要實(shí)現(xiàn)UITableViewDataSource協(xié)議莹规,在這個(gè)協(xié)議中定義了多種數(shù)據(jù)操作方法,創(chuàng)建一個(gè)簡單的聯(lián)系人管理進(jìn)行演示:

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ContectUserInfo : NSObject
#pragma mark 姓
@property (nonatomic,copy) NSString *firstName;
#pragma mark 名
@property (nonatomic,copy) NSString *lastName;
#pragma mark 手機(jī)號碼
@property (nonatomic,copy) NSString *phoneNumber;
#pragma mark 帶參數(shù)的構(gòu)造函數(shù)
-(ContectUserInfo *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber;
#pragma mark 取得姓名
-(NSString *)getName;
#pragma mark 帶參數(shù)的靜態(tài)對象初始化方法
+(ContectUserInfo *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber;
@end
NS_ASSUME_NONNULL_END
#import "ContectUserInfo.h"
@implementation ContectUserInfo
-(ContectUserInfo *)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];
}
+(ContectUserInfo *)initWithFirstName:(NSString *)firstName andLastName:(NSString *)lastName andPhoneNumber:(NSString *)phoneNumber{
    ContectUserInfo *contact1=[[ContectUserInfo alloc]initWithFirstName:firstName andLastName:lastName andPhoneNumber:phoneNumber];
    return contact1;
}
@end
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface ContectUserInfoGroup : NSObject
#pragma mark 組名
@property (nonatomic,copy) NSString *name;
#pragma mark 分組描述
@property (nonatomic,copy) NSString *detail;
#pragma mark 聯(lián)系人
@property (nonatomic,strong) NSMutableArray *contacts;
#pragma mark 帶參數(shù)個(gè)構(gòu)造函數(shù)
-(ContectUserInfoGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts;
#pragma mark 靜態(tài)初始化方法
+(ContectUserInfoGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts;
@end
NS_ASSUME_NONNULL_END

#import "ContectUserInfoGroup.h"
@implementation ContectUserInfoGroup
-(ContectUserInfoGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts{
    if (self=[super init]) {
        self.name=name;
        self.detail=detail;
        self.contacts=contacts;
    }
    return self;
}

+(ContectUserInfoGroup *)initWithName:(NSString *)name andDetail:(NSString *)detail andContacts:(NSMutableArray *)contacts{
    ContectUserInfoGroup *group1=[[ContectUserInfoGroup alloc]initWithName:name andDetail:detail andContacts:contacts];
    return group1;
}
@end
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ContactViewController : UIViewController
@end
NS_ASSUME_NONNULL_END
#import "ContactViewController.h"
#import "ContectUserInfo.h"
#import "ContectUserInfoGroup.h"
@interface ContactViewController ()<UITableViewDataSource>

@property (nonatomic, strong) UITableView *tableView;

@property (nonatomic, strong) NSMutableArray *contaceList;

@end

@implementation ContactViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"tableView分組數(shù)據(jù)源";
    [self.view addSubview:self.tableView];
    
    // Do any additional setup after loading the view.
}

#pragma mark - 數(shù)據(jù)源方法
#pragma mark 返回分組數(shù)
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    NSLog(@"計(jì)算分組數(shù)");
    return [self.contaceList count];
}

#pragma mark 返回每組行數(shù)
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    NSLog(@"計(jì)算每組(組%li)行數(shù)",(long)section);
    ContectUserInfoGroup *group1=[self.contaceList objectAtIndex:section];
    return group1.contacts.count;
}

#pragma mark返回每行的單元格
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //NSIndexPath是一個(gè)結(jié)構(gòu)體泌神,記錄了組和行信息
    NSLog(@"生成單元格(組:%li,行%li)",(long)indexPath.section,(long)indexPath.row);
    ContectUserInfoGroup *group=[self.contaceList objectAtIndex:indexPath.section];
    ContectUserInfo *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 返回每組頭標(biāo)題名稱
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    NSLog(@"生成組(組%li)名稱",(long)section);
    ContectUserInfoGroup *group=[self.contaceList objectAtIndex:section];
    return group.name;
}

#pragma mark 返回每組尾部說明
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    NSLog(@"生成尾部(組%li)詳情",(long)section);
   ContectUserInfoGroup *group=[self.contaceList objectAtIndex:section];
    return group.detail;
}

- (NSMutableArray *)contaceList{
    if (!_contaceList) {
        _contaceList = [NSMutableArray array];
        ContectUserInfo *contact1=[ContectUserInfo initWithFirstName:@"Cui" andLastName:@"Kenshin" andPhoneNumber:@"18500131234"];
        ContectUserInfo *contact2=[ContectUserInfo initWithFirstName:@"Cui" andLastName:@"Tom" andPhoneNumber:@"18500131237"];
        ContectUserInfoGroup *group1=[ContectUserInfoGroup initWithName:@"C" andDetail:@"With names beginning with C" andContacts:[NSMutableArray arrayWithObjects:contact1,contact2, nil]];
        [_contaceList addObject:group1];
        
        
        
        ContectUserInfo *contact3=[ContectUserInfo initWithFirstName:@"Lee" andLastName:@"Terry" andPhoneNumber:@"18500131238"];
        ContectUserInfo *contact4=[ContectUserInfo initWithFirstName:@"Lee" andLastName:@"Jack" andPhoneNumber:@"18500131239"];
        ContectUserInfo *contact5=[ContectUserInfo initWithFirstName:@"Lee" andLastName:@"Rose" andPhoneNumber:@"18500131240"];
        ContectUserInfoGroup *group2=[ContectUserInfoGroup initWithName:@"L" andDetail:@"With names beginning with L" andContacts:[NSMutableArray arrayWithObjects:contact3,contact4,contact5, nil]];
        [_contaceList addObject:group2];
        
        
        
        ContectUserInfo *contact6=[ContectUserInfo initWithFirstName:@"Sun" andLastName:@"Kaoru" andPhoneNumber:@"18500131235"];
        ContectUserInfo *contact7=[ContectUserInfo initWithFirstName:@"Sun" andLastName:@"Rosa" andPhoneNumber:@"18500131236"];
        
        ContectUserInfoGroup *group3=[ContectUserInfoGroup initWithName:@"S" andDetail:@"With names beginning with S" andContacts:[NSMutableArray arrayWithObjects:contact6,contact7, nil]];
        [_contaceList addObject:group3];
        
        
        ContectUserInfo *contact8=[ContectUserInfo initWithFirstName:@"Wang" andLastName:@"Stephone" andPhoneNumber:@"18500131241"];
        ContectUserInfo *contact9=[ContectUserInfo initWithFirstName:@"Wang" andLastName:@"Lucy" andPhoneNumber:@"18500131242"];
        ContectUserInfo *contact10=[ContectUserInfo initWithFirstName:@"Wang" andLastName:@"Lily" andPhoneNumber:@"18500131243"];
        ContectUserInfo *contact11=[ContectUserInfo initWithFirstName:@"Wang" andLastName:@"Emily" andPhoneNumber:@"18500131244"];
        ContectUserInfo *contact12=[ContectUserInfo initWithFirstName:@"Wang" andLastName:@"Andy" andPhoneNumber:@"18500131245"];
        ContectUserInfoGroup *group4=[ContectUserInfoGroup initWithName:@"W" andDetail:@"With names beginning with W" andContacts:[NSMutableArray arrayWithObjects:contact8,contact9,contact10,contact11,contact12, nil]];
        [_contaceList addObject:group4];
        
        
        ContectUserInfo *contact13=[ContectUserInfo initWithFirstName:@"Zhang" andLastName:@"Joy" andPhoneNumber:@"18500131246"];
        ContectUserInfo *contact14=[ContectUserInfo initWithFirstName:@"Zhang" andLastName:@"Vivan" andPhoneNumber:@"18500131247"];
        ContectUserInfo *contact15=[ContectUserInfo initWithFirstName:@"Zhang" andLastName:@"Joyse" andPhoneNumber:@"18500131248"];
        ContectUserInfoGroup *group5=[ContectUserInfoGroup initWithName:@"Z" andDetail:@"With names beginning with Z" andContacts:[NSMutableArray arrayWithObjects:contact13,contact14,contact15, nil]];
        [_contaceList addObject:group5];
    }
    return _contaceList;
}

- (UITableView *)tableView{
    if (!_tableView) {
        _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
        _tableView.backgroundColor = [UIColor whiteColor];
        _tableView.dataSource=self;//設(shè)置數(shù)據(jù)源良漱,注意必須實(shí)現(xiàn)對應(yīng)的UITableViewDataSource協(xié)議
    }
    return _tableView;
}
@end

#pragma mark 返回每組標(biāo)題索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    NSLog(@"生成組索引");
    NSMutableArray *indexs=[[NSMutableArray alloc]init];
    for(ContectUserInfo *group in self.contaceList){
        [indexs addObject:group.firstName];
    }
    return indexs;
}
計(jì)算分組數(shù)>>>計(jì)算每組的行數(shù)>>>生成分組索引>>>依次生成每組的單元格

代理方法

#pragma mark - 代理方法
#pragma mark 設(shè)置分組標(biāo)題內(nèi)容高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    if(section==0){
        return 50;
    }
    return 40;
}

#pragma mark 設(shè)置每行高度(每行高度可以不一樣)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 45;
}

#pragma mark 設(shè)置尾部說明內(nèi)容高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 40;
}
點(diǎn)擊監(jiān)聽
#pragma mark 點(diǎn)擊行
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    _selectedIndexPath=indexPath;
    ContectUserInfoGroup *group=[self.contaceList objectAtIndex:indexPath.section];
    ContectUserInfo *contact=group.contacts[indexPath.row];
    //創(chuàng)建彈出窗口
    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"System Info" message:[contact getName] delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    alert.alertViewStyle=UIAlertViewStylePlainTextInput; //設(shè)置窗口內(nèi)容樣式
    UITextField *textField= [alert textFieldAtIndex:0]; //取得文本框
    textField.text=contact.phoneNumber; //設(shè)置文本框內(nèi)容
    [alert show]; //顯示窗口
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舞虱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子母市,更是在濱河造成了極大的恐慌矾兜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患久,死亡現(xiàn)場離奇詭異椅寺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒋失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門返帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篙挽,你說我怎么就攤上這事荆萤。” “怎么了铣卡?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵链韭,是天一觀的道長。 經(jīng)常有香客問我算行,道長梧油,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任州邢,我火速辦了婚禮儡陨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘量淌。我一直安慰自己骗村,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布呀枢。 她就那樣靜靜地躺著胚股,像睡著了一般。 火紅的嫁衣襯著肌膚如雪裙秋。 梳的紋絲不亂的頭發(fā)上琅拌,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音摘刑,去河邊找鬼进宝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛枷恕,可吹牛的內(nèi)容都是我干的党晋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼未玻!你這毒婦竟也來了灾而?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤扳剿,失蹤者是張志新(化名)和其女友劉穎旁趟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庇绽,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轻庆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敛劝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余爆。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夸盟,靈堂內(nèi)的尸體忽然破棺而出蛾方,到底是詐尸還是另有隱情,我是刑警寧澤上陕,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布桩砰,位于F島的核電站,受9級特大地震影響释簿,放射性物質(zhì)發(fā)生泄漏亚隅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一庶溶、第九天 我趴在偏房一處隱蔽的房頂上張望煮纵。 院中可真熱鬧,春花似錦偏螺、人聲如沸行疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碎连。三九已至墅诡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間板熊,已是汗流浹背帘饶。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工甜无, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柳譬,地道東北人喳张。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像征绎,于是被迫代替她去往敵國和親蹲姐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345