精通iOS开发 第六讲 高级UI控件-表视图


iPhone与 iPad应用开发课程 精通 iOS开发 第六讲 高级 UI控件-表视图 主讲人 : 关东升 eorient@sina.com 主要知识点 w  UI高级控件表视图 w  表视图控制器 关于表视图 w  iOS中很多应用都使用了表视图,表视图可以分为: n  无格式表视图 n  分段(Sections)表视图,而分段表视图又分为: l  普通分段表视图 l  分组分段表视图 l  索引分段表视图 无格式表视图 分组分段表视图 索引分段表视图 简单表视图(无格式) SimpleTableViewController.h #import @interface SimpleTableViewController : UIViewController { NSArray *listData; NSArray *listImage; } @property (nonatomic, retain) NSArray *listData; @property (nonatomic, retain) NSArray *listImage; @end 代码参考SimpleTable 表视图中的数据源协议 •  tableView: numberOfRowsInSection: •  提供表视图某个分段的行数。 •  tableView: cellForRowAtIndexPath: •  提供表视图单元格所需要的数据。 表视图中的委托协议 •  tableView: didSelectRowAtIndexPath: •  该委托方法是表视图单元格选择完成之后触发的 方法。 m文件中的初始化加载方法 - (void)viewDidLoad { NSArray *array = [[NSArray alloc] initWithObjects:@"A1-南非",@"A2-墨西哥", @"B1-阿根廷",@"B2-尼日利亚",@"C1-英格兰",@"C2-美国", @"D1-德国",@"D2-澳大利亚",@"E1-荷兰",@"E2-丹麦", @"G1-巴西",@"G2-朝鲜",@"H1-西班牙",@"H2-瑞士",nil]; NSArray *images = [[NSArray alloc] initWithObjects:@"SouthAfrica.png",@"Mexico.png", @"Argentina.png",@"Nigeria.png",@"England.png",@"USA.png", @"Germany.png",@"Australia.png",@"Holland.png",@"Denmark.png", @"Brazil.png",@"NorthKorea.png",@"Spain.png",@"Switzerland.png",nil]; self.listData = array; self.listImage = images; [array release]; [images release]; [super viewDidLoad]; } m释放资源 - (void)viewDidUnload { [super viewDidUnload]; self.listData = nil; self.listImage = nil; } - (void)dealloc { [listData release]; [listImage release]; [super dealloc]; } 实现TableView数据源方法 - (NSInteger)tableView:(UITableView *)tableView! numberOfRowsInSection:(NSInteger)section {! "return [listData count];! }! - (UITableViewCell *)tableView:(UITableView *)tableView ! " " cellForRowAtIndexPath:(NSIndexPath *)indexPath {! "static NSString *SimpleCellIdentifier = @"SimpleCellIdentifier";! "UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SimpleCellIdentifier];! "if (cell == nil) {! " "cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault! " " " " " reuseIdentifier:SimpleCellIdentifier] autorelease];! "}! "NSUInteger row = [indexPath row];! "cell.textLabel.text = [listData objectAtIndex:row];! "UIImage *img = [UIImage imageNamed:[listImage objectAtIndex:row]];! "cell.imageView.image = img;! "return cell;! }! 解释 •  - (NSInteger)tableView:(UITableView *)tableView •  numberOfRowsInSection:(NSInteger)section •  该方法是为表视图提供分段的个数,只有一个分段所以。 •  - (UITableViewCell *)tableView:(UITableView *)tableView ! •  cellForRowAtIndexPath:(NSIndexPath *)indexPath! •  提供表视图单元个所需要的数据。 •  static NSString *SimpleCellIdentifier = @"SimpleCellIdentifier";! •  该语句为表视图单元格提供了一个标识,当上面的单元格滚出屏幕,下面的单 元格滚入屏幕时候,可以通过判断这个标识是否有可以重用的单元格,如果有 则重用,如果没有则创建一个新的。 解释 w  表视图单元格的单元元素: n  图片 cell.imageView.image n  文本标签 cell.textLabel.text w  详细文本标签 cell.detailTextLabel.text 副标题标签 图片 主标题标签 单 元格样 式 w  UITableViewCellStyle枚举类 型有成员 : w  UITableViewCellStyleDefault, w  UITableViewCellStyleValue1, w  UITableViewCellStyleValue2, w  UITableViewCellStyleSubtitle 5VCPFCTF 5V[NGU HQT 6CDNG8KGY %GNNU +P CFFKVKQP VQ VJG VYQ UV[NGU QH VCDNG XKGYU 7+-KV FGHKPGU HQWT UV[NGU HQT VJG EGNNU VJCV C VCDNG XKGY WUGU VQ FTCY KVU TQYU ;QW OC[ ETGCVG EWUVQO VCDNGXKGY EGNNU YKVJ FKHHGTGPV CRRGCTCPEGU KH [QW YKUJ DWV VJGUG HQWT RTGFGHKPGF EGNN UV[NGU CTG UWKVCDNG HQT OQUV RWTRQUGU 6JG VGEJPKSWGU HQT ETGCVKPI VCDNGXKGY EGNNU KP C RTGFGHKPGF UV[NG CPF HQT ETGCVKPI EWUVQO EGNNU CTG FGUETKDGF KP ¥# %NQUGT .QQM CV 6CDNG8KGY %GNNU¦ RCIG  0QVG6CDNGXKGY EGNN UV[NGU YGTG KPVTQFWEGF KP K15  6JG FGHCWNV UV[NG HQT VCDNGXKGY TQYU WUGU C UKORNG EGNN UV[NG VJCV JCU C UKPING VKVNG CPF RGTOKVU CP KOCIG (KIWTG   6JKU UV[NG KU CUUQEKCVGF YKVJ VJG UITableViewCellStyleDefault EQPUVCPV (KIWTG  &GHCWNV VCDNG TQY UV[NG PQ UWDVKVNG 6JG EGNN UV[NG HQT VJG TQYU KP (KIWTG  NGHVCNKIPU VJG OCKP VKVNG CPF RWVU C ITC[ UWDVKVNG TKIJV WPFGT KV +V CNUQ RGTOKVU CP KOCIG KP VJG FGHCWNV KOCIG NQECVKQP 6JKU UV[NG KU WUGF KP VJG K2QF CRRNKECVKQP CPF KU CUUQEKCVGF YKVJ VJG UITableViewCellStyleSubtitle EQPUVCPV 5VCPFCTF 5V[NGU HQT 6CDNG8KGY %GNNU  ^Š#RRNG+PE#NN4KIJVU4GUGTXGF %*#26'4  6CDNG 8KGY 5V[NGU CPF #EEGUUQT[ 8KGYU UITableViewCellStyleDefault UITableViewCellStyleSubtitle (KIWTG  6CDNG TQY UV[NG YKVJ UWDVKVNG WPFGT VKVNG 6JG EGNN UV[NG HQT VJG TQYU KP (KIWTG  NGHVCNKIPU VJG OCKP VKVNG CPF RWVU VJG UWDVKVNG KP DNWG VGZV CPF TKIJVCNKIPU KV QP VJG TKIJV UKFG QH VJG TQY +OCIGU CTG PQV RGTOKVVGF 6JKU UV[NG KU WUGF KP VJG 5GVVKPIU CRRNKECVKQP YJGTG VJG UWDVKVNG KPFKECVGU VJG EWTTGPV UGVVKPI HQT C RTGHGTGPEG +V KU CUUQEKCVGF YKVJ VJG UITableViewCellStyleValue1 EQPUVCPV (KIWTG  6CDNG TQY UV[NG YKVJ TKIJVCNKIPGF UWDVKVNG  5VCPFCTF 5V[NGU HQT 6CDNG8KGY %GNNU ^Š#RRNG+PE#NN4KIJVU4GUGTXGF %*#26'4  6CDNG 8KGY 5V[NGU CPF #EEGUUQT[ 8KGYU UITableViewCellStyleValue1 UITableViewCellStyleValue2 (KIWTG  6CDNG TQY UV[NG YKVJ UWDVKVNG WPFGT VKVNG 6JG EGNN UV[NG HQT VJG TQYU KP (KIWTG  NGHVCNKIPU VJG OCKP VKVNG CPF RWVU VJG UWDVKVNG KP DNWG VGZV CPF TKIJVCNKIPU KV QP VJG TKIJV UKFG QH VJG TQY +OCIGU CTG PQV RGTOKVVGF 6JKU UV[NG KU WUGF KP VJG 5GVVKPIU CRRNKECVKQP YJGTG VJG UWDVKVNG KPFKECVGU VJG EWTTGPV UGVVKPI HQT C RTGHGTGPEG +V KU CUUQEKCVGF YKVJ VJG UITableViewCellStyleValue1 EQPUVCPV (KIWTG  6CDNG TQY UV[NG YKVJ TKIJVCNKIPGF UWDVKVNG  5VCPFCTF 5V[NGU HQT 6CDNG8KGY %GNNU ^Š#RRNG+PE#NN4KIJVU4GUGTXGF %*#26'4  6CDNG 8KGY 5V[NGU CPF #EEGUUQT[ 8KGYU 6JG EGNN UV[NG HQT VJG TQYU KP (KIWTG  RWVU VJG OCKP VKVNG KP DNWG CPF TKIJVCNKIPU KV CV C RQKPV VJCV¨U KPFGPVGF HTQO VJG NGHV UKFG QH VJG TQY 6JG UWDVKVNG KU NGHVCNKIPGF CV C UJQTV FKUVCPEG VQ VJG TKIJV QH VJKU RQKPV 6JKU UV[NG FQGU PQV CNNQY KOCIGU +V KU WUGF KP VJG %QPVCEVU RCTV QH VJG 2JQPG CRRNKECVKQP CPF KU CUUQEKCVGF YKVJ VJG UITableViewCellStyleValue2 EQPUVCPV (KIWTG  6CDNG TQY UV[NG KP %QPVCEVU HQTOCV #EEGUUQT[ 8KGYU 6JGTG CTG VJTGG UVCPFCTF MKPFU QH CEEGUUQT[ XKGYU UJQYP YKVJ VJGKT CEEGUUQT[V[RG EQPUVCPV  &GUETKRVKQP5VCPFCTF CEEGUUQT[ XKGYU &KUENQUWTG KPFKECVQT¤UITableViewCellAccessoryDisclosure- Indicator ;QW WUG VJG FKUENQUWTG KPFKECVQT YJGP UGNGEVKPI C EGNN TGUWNVU KP VJG FKURNC[ QH CPQVJGT VCDNG XKGY TGHNGEVKPI VJG PGZV NGXGN KP VJG FCVCOQFGN JKGTCTEJ[ &GVCKN FKUENQUWTG DWVVQP¤UITableViewCellAccessoryDetail- DisclosureButton ;QW WUG VJG FGVCKN FKUENQUWTG DWVVQP YJGP UGNGEVKPI C EGNN TGUWNVU KP C FGVCKN XKGY QH VJCV KVGO YJKEJ OC[ QT OC[ PQV DG C VCDNG XKGY  %JGEM OCTM¤UITableViewCellAccessoryCheckmark ;QW WUG C EJGEMOCTM YJGP C VQWEJ QP C TQY TGUWNVU KP VJG UGNGEVKQP QH VJCV KVGO 6JKU MKPF QH VCDNG XKGY KU MPQYP CU C UGNGEVKQP NKUV CPF KV KU CPCNQIQWU VQ C RQRWR NKUV 5GNGEVKQP NKUVU ECP NKOKV UGNGEVKQPU VQ QPG TQY QT VJG[ ECP CNNQYGF OWNVKRNG TQYU YKVJ EJGEMOCTMU #EEGUUQT[ 8KGYU  ^Š#RRNG+PE#NN4KIJVU4GUGTXGF %*#26'4  6CDNG 8KGY 5V[NGU CPF #EEGUUQT[ 8KGYU 实现TableView委托方法 - (void)tableView:(UITableView *)tableView ! didSelectRowAtIndexPath:(NSIndexPath *)indexPath {! "NSUInteger row = [indexPath row];! "NSString *rowValue = [listData objectAtIndex:row];! "! "NSString *message = [[NSString alloc] initWithFormat:@"你选 择了%@队。", rowValue];! "UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"行 选择" ! " " " " " " " " "message:message ! " " " " " " " " "delegate:self ! " " " " " " " " "cancelButtonTitle:@"Ok" ! " " " " " " " " "otherButtonTitles:nil];! "[alert show];! "[alert release];! "[message release];! "[tableView deselectRowAtIndexPath:indexPath animated:YES];! }! 解释 w  该委托方法是选中的单元格时候触发的方法, w  [indexPath row]语句可以获得选中的行号。 w  [tableView deselectRowAtIndexPath:indexPath animated:YES]; w  是可以在表视图选择完成单元格后背景消失,再 弹出alert对话框。 设计NIB文件 在Style属性选择 :Plain 链接输出口 w  Table View的委托和数据源输出口,需要File‘s Owner与委托和数据源链接。 分段表视图 SectionTableViewController.h #import @interface SectionTableViewController : UIViewController { NSDictionary *teams; NSArray *teamsname; } @property (nonatomic,retain) NSDictionary *teams; @property (nonatomic,retain) NSArray *teamsname; @end 代码参考SectionTable 解释 w  UITableViewDataSource,表视图中的数据源: tableView: numberOfRowsInSection: w  提供表视图分段的个数。 w  tableView: cellForRowAtIndexPath: w  提供表视图单元个所需要的数据。 w  UITableViewDelegate,表视图中的委托: w  tableView: didSelectRowAtIndexPath: w  该委托方法是表视图单元个选择之后发生触发 m文件初始化加载方法 - (void)viewDidLoad { NSBundle *bundle = [NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:@”足球队 dictionary” ofType:@"plist"]; NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath]; self.teams = dict; [dict release]; self.teamsname = [[teams allKeys] sortedArrayUsingSelector:@selector (compare:)]; } 解释 w  从属性文件中加载数据到NSDictionary对象中 ,它的key作为表视图的分段的名字,而value 部分集合作为表视图单元格。 编辑数据属性文件 m释放资源 - (void)viewDidUnload { [super viewDidUnload]; self.teams = nil; self.teamsname = nil; } - (void)dealloc { [teams release]; [teamsname release]; [super dealloc]; } 实现TableView数据源方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSString *name = [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; return [team count]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [teamsname count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *name = [teamsname objectAtIndex:section]; return name; } 解释 w  - (NSInteger)tableView:(UITableView *)tableView w  numberOfRowsInSection:(NSInteger)section w  该方法是为表视图提供某个分段中单元格个数。 w  - (NSInteger)numberOfSectionsInTableView: (UITableView *)tableView w  提供表视图中分段的个数。 w  - (NSString *)tableView:(UITableView *)tableView w  titleForHeaderInSection:(NSInteger)section w  提供表视图中分段的Header信息。 接上实现TableView数据源方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; NSString *name= [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; static NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text = [team objectAtIndex:row]; return cell; } 实现TableView委托方法 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath { NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; NSString *name = [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; NSString *selectedteam = [team objectAtIndex:row]; NSString *message = [[NSString alloc] initWithFormat:@"你选择了%@队。", selectedteam]; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"行选择" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [message release]; [alert show]; [alert release]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } 解释 w  该委托方法是选中的单元格时候触发的方法, w  [indexPath row]语句可以获得选中的行号。 w  [tableView deselectRowAtIndexPath:indexPath animated:YES]; w  是可以在表试图选择完成单元格后背景消失,再 弹出alert对话框。 设计NIB文件 在Style属性选择 :Plain 链接输出口 w  Table View的委托和数据源输出口,需要File‘s Owner与委托和数据源链接。 分组分段表视图 w  由普通分段表变成分 组分段表很简单,修 改属性就可以了 修改分组分段 w  在IB中打开表视图属 性设置框,在Style项 目选择Grouped。 在Style属性选择 :Grouped 索引表视图 w  索引表就是在右边增 加一个索引列,如果 按照归类它应该属于 分段表范围。 代码参考 SectionIndexingTable 索引表实现 w  索引表实现很简单只是需要在分段表的代码基础 上增加一个数据源(UITableViewDataSource) 实现方法就可以了: -(NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { return teamsname; } w  这个方法是为表视图提供索引所需要的数据集合。 实现搜索栏 代码参考 SectionSearchTable SectionTableViewController.h @interface SectionTableViewController : UIViewController { NSMutableDictionary *allteams; NSMutableDictionary *teams; NSArray *teamsname; } @property (nonatomic,retain) NSMutableDictionary *teams; @property (nonatomic,retain) NSMutableDictionary *allteams; @property (nonatomic,retain) NSArray *teamsname; -(void)resetSearch; m文件中的初始化方法 - (void)viewDidLoad { NSBundle *bundle = [NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:@"足球队dictionary" ofType:@"plist"]; NSMutableDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath]; self.allteams = dict; [dict release]; [self resetSearch]; } m文件中的resetSearch方法 -(void)resetSearch { self.teams = self.allteams ; NSMutableArray *keysArray = [[NSMutableArray alloc] init]; [keysArray addObjectsFromArray:[[teams allKeys] sortedArrayUsingSelector:@selector(compare:)]]; self.teamsname = keysArray; [keysArray release]; } m释放资源 - (void)viewDidUnload { [super viewDidUnload]; self.teams = nil; self.teamsname = nil; } - (void)dealloc { [teams release]; [teamsname release]; [super dealloc]; } 实现TableView数据源方法 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSString *name = [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; return [team count]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [teamsname count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *name = [teamsname objectAtIndex:section]; return name; } 接上实现TableView数据源方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; NSString *name= [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; static NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.text = [team objectAtIndex:row]; return cell; } 接上实现TableView数据源方法 /* 增加索引 */ -(NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { return teamsname; } 实现TableView委托方法 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath { NSUInteger section = [indexPath section]; NSUInteger row = [indexPath row]; NSString *name = [teamsname objectAtIndex:section]; NSArray *team = [teams objectForKey:name]; NSString *selectedteam = [team objectAtIndex:row]; NSString *message = [[NSString alloc] initWithFormat:@"你选择了%@队。", selectedteam]; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"行选择" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [message release]; [alert show]; [alert release]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } Search Bar 委托方法 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if ([searchText length] == 0) { [self resetSearch]; return; } NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; for (NSString *key in self.allteams) { NSMutableArray *arry = [allteams valueForKey:key]; NSMutableArray *newTeams = [[NSMutableArray alloc] init]; for (NSString *teamName in arry) { if ([teamName rangeOfString: searchText options:NSCaseInsensitiveSearch].location != NSNotFound) { [newTeams addObject:teamName]; } } if ([newTeams count] > 0) { [dict setObject:newTeams forKey:key]; } [newTeams release]; } Search Bar 委托方法 self.teamsname = [[dict allKeys] sortedArrayUsingSelector:@selector(compare:)]; self.teams = dict; [dict release]; } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { [self resetSearch]; } 解释 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText w  搜索栏中的文本发生变化的时候,触发这个方法。 - (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar w  点击搜索栏的取消按钮时候调用。 视图设计
还剩53页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

ederwin

贡献于2014-08-26

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf