UITableView Review

基本概念:

 

1. UITableView 的 Style 预设有两种:Plain 及 Grouped。

Plain:
點擊看全圖

Grouped:
點擊看全圖

2. 装在 UITableView 里面的元素是 UITableViewCell。

Cell的结构图:
點擊看全圖

3. 而 UITableViewCell 预设有4种样式 Style:

UITableViewCellStyleDefault:预设使用这种,若左侧ImageView没图的话,只有一行字(textLable.text)。
點擊看全圖

UITableViewCellStyleValue1:左侧为textLable.text并且左对齐,右侧为detailTextLable.text并且右对齐。
點擊看全圖

UITableViewCellStyleValue2:左侧为detailTextLable.text,右侧为textLable.text并且左对齐。
點擊看全圖

UITableViewCellStyleSubtitle:跟UITableViewCellStyleDefault大致相同,detailTextLable.text出现在textLable.text下方。
點擊看全圖

textLable和detailTextLable都包含在contentView里面。

 

来源:http://skyx.wordpress.com/2012/01/09/ios-uitableview-use-and-summary/

 

UITableView 基本使用方法 (一) – 如何顯示資料

 

UITableView 是 iOS 中,非常重要的使用者介面 ,仔细观察 iOS App 中,除了游戏类的 App 以外,几乎都会用上 UITableview, 因为使用 UITableView 的目的就是要呈现数十笔甚至上百笔的资料给使用者,透过 UITableView ,使用者可以透过捲动画面,来获得或是查询想要的资料,本文将介绍 UITableView 的基本使用方法。

 

在 Xcode 中,开启一个 Single View Application, Device Family 为iPhone,取消 “Use Storyboard” 和 “Include Unit Tests”.

 

在xib文件中,拖入 Table View,并且使 Outlets 下的 dataSource 和 delegate 与 File’s Owner相连。

 

ViewController.h

C代码  收藏代码
  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
  3. {
  4.     NSArray *items;
  5. }
  6. @property (nonatomic,retain) NSArray *items;
  7. @end

 

ViewController.m

Java代码  收藏代码
  1. @synthesize items;
  2. – (void)viewDidLoad
  3. {
  4.     [super viewDidLoad];
  5.     // Do any additional setup after loading the view, typically from a nib.
  6.     // Set up the NSArray
  7.     self.items = [[NSArray alloc] initWithObjects:@”Item 1″,@”Item 2″,@”Item 3″, @”Item 4″,@”Item 5″,@”Item 6″,@”Item 7″,@”Item 8″,@”Item 9″,@”Item 10″,@”Item 11″,@”Item 12″, nil];
  8. }
  9. #pragma mark – TableView Methods
  10. – (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  11. {
  12.     return [self.items count]; // or self.items.count;
  13. }
  14. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  15. {
  16.     // Step 1: Check to see if we can reuse a cell from a row that has just rolled off the screen
  17.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”cell”];
  18.     // Step 2: If there are no cells to reuse, create a new one
  19.     if(cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@”cell”];
  20.     // Add a detail view accessory
  21.     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
  22.     // Step 3: Set the cell text
  23.     cell.textLabel.text = [items objectAtIndex:indexPath.row];
  24.     // Step 4: Return the cell
  25.     return cell;
  26. }

 

或者添加图片

 

C代码  收藏代码
  1. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3.     // Step 1: Check to see if we can reuse a cell from a row that has just rolled off the screen
  4.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”cell”];
  5.     // Step 2: If there are no cells to reuse, create a new one
  6.     if(cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@”cell”];
  7.     // Add a detail view accessory
  8.     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
  9.     // Step 3: Set the cell text
  10.     cell.textLabel.text = [items objectAtIndex:indexPath.row];
  11.     //每一行row進來都判定一下,分別依次選用不同的圖片
  12.     switch (indexPath.row)
  13.     {
  14.         case 0:
  15.             cell.imageView.image = [UIImage imageNamed:@”image0.png”];
  16.         break;
  17.         case 1:
  18.             cell.imageView.image = [UIImage imageNamed:@”image1.png”];
  19.         break;
  20.         case 2:
  21.             cell.imageView.image = [UIImage imageNamed:@”image2.png”];
  22.         break;
  23.         default:
  24.             cell.imageView.image = [UIImage imageNamed:@”common.png”];
  25.         break;
  26.     }
  27.     //設字體、顏色、背景色什麼的
  28.     cell.textLabel.backgroundColor = [UIColor clearColor];
  29.     cell.detailTextLabel.backgroundColor = [UIColor clearColor];
  30.     cell.textLabel.textColor = [UIColor colorWithRed:54.0/255.0 green:161.0/255.0 blue:219.0/255.0 alpha:1];
  31.     cell.detailTextLabel.textColor = [UIColor colorWithRed:135.0/255.0 green:135.0/255.0 blue:135.0/255.0 alpha:1];
  32.     //設定textLabel的最大允許行數,超過的話會在尾未以…表示
  33.     cell.textLabel.numberOfLines = 2;
  34.     // Step 4: Return the cell
  35.     return cell;
  36. }

视频: http://www.youtube.com/watch?v=sTM7nxup_xc&feature=related

 

解释如下:

 

要设定 UITableView 欲显示资料的部份,首先找到 numberOfSectionsInTableView: 方法。在此方法中,需要设定将会呈现多少个 section,也就是对 UITableView 做分类,在此实作中,没有需要用到两个以上的分类,因此我们设定回传值为 1 ,完整的方法设定如下:

C代码  收藏代码
  1. – (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  2. return 1;
  3. }

再来设定有多少列要显示在 UITableView 上面,在 tableView: numberOfRowsInSection: 方法中,我们告知 UITableView 将有多少笔资料要显示给使用者,完整方法设定如下:

C代码  收藏代码
  1. – (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  2. //阵列中所包含的物件个数,即为要显示的资料数量,也就是多少列
  3. return [self.tableViewArray count];
  4. }

最后在 UITableView 当中,我们要告知每一个 UITableViewCell 需要输出什么样的资料,在此范例中,我们是以字串做为资料的显示,因此我们将 tableViewArray 中的每一个字串指定给每一列,在 tableView: cellForRowAtIndexPath:方法中,我们输入以下程式码:

C代码  收藏代码
  1. // 设定以下字串的用意是设定一个标籤,来进行重复使用 UITableViewCell 的工作
  2. static NSString *CellIdentifier = @”Cell”;
  3. //询问 tableView 是否有可以重复利用的 UITableViewCell
  4. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  5. //若无则产生一个新的 UITableViewCell
  6. if (cell == nil) {
  7. //产生 UITableViewCell 的同时,设定 UITableViewCell 的形态,并且赋予标籤,以利重复使用 UITableViewCell
  8. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  9. }
  10. //设定 UITableViewCell 中 textLable 的文字,根据 indexPath.row 来给定在 tableViewArray 中的字串
  11. cell.textLabel.text = [self.tableViewArray objectAtIndex:indexPath.row];
  12. return cell;

上列方法中,由于 UITableView 一次包含数十个 UITableViewCell, 并且进行上下捲动,当 UITableViewCell 数量有上百笔的时候,不可能一次产生数百个 UITableViewCell 加入到 UITableView 当中,因此 Apple 使用了可以重复利用 UITableViewCell 的机制,赋予 UITableViewCell 可以重复使用的标籤,当 UITableViewCell 因捲动而不在画面上的时候,就会先呼叫 UITableView 有无可以重复使用的 UITableViewCell,这样可以节省记忆体的使用量。

 

以上完成后,即可显示出 UITableView 并显示阵列中的字串在每一个 UITableViewCell 上。最后必须要说明的是,使用 UITableViewController 时,其 tableViewController.view 所回传的物件并非 UIView 而是 UITableView,因为在 XIB 档中,File’s Owner 的 view outlet 是与 UITableView 相连接的。

 

UITableView 基本使用法 (二) – 删除资料列

 

在上一篇 UITableView 基本使用法 (一) 中,我们介绍了如何让 UITableView 呈现我们需要的资料,在接下来的文章中,将介绍如何删除资料列。

 

在介绍如何删除资料列之前,应该先回顾一下 MVC design pattern, 也就是 Model – View – Controller 的设计样式。UITableView 也是遵循这样的 design pattern, 在 UITableView 基本使用法 (一) 中,我们使用阵列也就是我们的 Model 来存放字串资料,然后透过 UITableViewController 来变更 UITableView 的显示内容,同样地,在删除 UITableView 中的资料列时,也代表着我们将阵列中的资料删除,倘若我们不变更阵列的内容,也就是我们不对阵列进行物件的删除,然后直接要求 UITableView 进行显示资料的删除时,得到的结果就是 crash!因此,进行资料列的删除首要是先对 Model 也就是阵列内容进行删除,然后再执行 UITableView 的显示资料删除,而进行 Model 以及 View 内容变更的正是 UITableViewController, 如此符合 MVC 的精神。

 

回归正题,依据之前的 UITableView 基本使用法 (一) Xcode 专案,回到 UITableViewController subclass, 原本在 viewDidLoad 中,我们使用 NSArray 来产生阵列,但是 NSArray 无法进行物件的新增与删除,因此,必须将 阵列重新宣告为 NSMutableArray, 因为我们将利用 NSMutableArray 中的 removeObjectAtIndex: 方法来移除物件。在 viewDidLoad 中重新设定阵列的宣告,程式码如下:

 

.h

C代码  收藏代码
  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
  3. {
  4.     NSMutableArray *items;
  5. }
  6. @property (nonatomic,retain) NSMutableArray *items;
  7. @end
C代码  收藏代码
  1. @synthesize items;
  2.  – (void)viewDidLoad {
  3.  [super viewDidLoad];
  4.  //设定包含六个 NSString 字串的阵列
  5.  self.items = [[NSMutableArray alloc] initWithObjects:@”First”, @”Second”, @”Third”,@”Fourth”,@”Five”,@”Six”,nil];
  6.  }

再来置入以下方法,此方法为设定是否 UITableView 能否被进行编辑,在此方法中回传 YES , 代表 UITableView 起始删除功能。

C代码  收藏代码
  1. – (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
  2. return YES;
  3. }

当我们起始删除功能之后,就可以利用手指划过 UITableViewCell 来进行删除的动作。接下来,置入以下方法,tableView: commitEditingStyle: forRowAtIndexPath:,此方法为根据 UITableView 回传的编辑模式,进行对应的处理方法。

C代码  收藏代码
  1. – (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
  2. if (editingStyle == UITableViewCellEditingStyleDelete) {
  3. //先行删除阵列中的物件
  4. [self.items removeObjectAtIndex:indexPath.row];
  5. //删除 UITableView 中的物件,并设定动画模式
  6. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
  7. }
  8. }

注意:NSMutableArray 和 NSArray 的区别

 

来源:http://furnacedigital.blogspot.com/2011/08/uitableview_22.html

 

其他方法:

 

C代码  收藏代码
  1. – (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
  2. //这个方法返回指定的 row 的高度。
C代码  收藏代码
  1. – (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
  2. //这个方法返回指定的 section的header view 的高度。
C代码  收藏代码
  1. – (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
  2. /这个方法返回指定的 section的footer view 的高度。
C代码  收藏代码
  1. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
  2. //返回指定的row 的cell。这个地方是比较关键的地方,一般在这个地方来定制各种个性化的 cell元素。这里只是使用最简单最基本的cell 类型。其中有一个主标题 cell.textLabel 还有一个副标题cell.detailTextLabel,  还有一个 image在最前头 叫cell.imageView.  还可以设置右边的图标,通过cell.accessoryType 可以设置是饱满的向右的蓝色箭头,还是单薄的向右箭头,还是勾勾标记。
C代码  收藏代码
  1. – (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
  2. //返回指定的 section 的header的高度
C代码  收藏代码
  1. – (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
  2. //返回指定的section 的 header  的 title,如果这个section header  有返回view,那么title就不起作用了。
C代码  收藏代码
  1. – (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
  2. //返回指定的 section header 的view,如果没有,这个函数可以不返回view
C代码  收藏代码
  1. – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  2. //当用户选中某个行的cell的时候,回调用这个。但是首先,必须设置tableview的一个属性为可以select 才行。
C代码  收藏代码
  1. TableView.allowsSelection=YES;
  2. cell.selectionStyle=UITableViewCellSelectionStyleBlue;
  3. //如果不希望响应select,那么就可以用下面的代码设置属性:
  4. TableView.allowsSelection=NO;
C代码  收藏代码
  1. //下面是响应select 点击函数,根据哪个section,哪个row 自己做出响应就好啦。
  2. – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  3. {
  4.     if (indexPath.section == 1)
  5.     {
  6.         return;
  7.     }
  8.     else if(indexPath.section==0)
  9.     {
  10.         switch (indexPath.row)
  11.         {
  12.             //聊天
  13.             case 0:
  14.             {
  15.                 [self  onTalkToFriendBtn];
  16.             }
  17.                 break;
  18.             default:
  19.                 break;
  20.         }
  21.     }
  22.     else
  23.     {
  24.         return ;
  25.     }
  26. }

//如何让cell 能够响应 select,但是选中后的颜色又不发生改变呢,那么就设置 cell.selectionStyle = UITableViewCellSelectionStyleNone;

C代码  收藏代码
  1. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  2.     //cell被选中后的颜色不变
  3.     cell.selectionStyle = UITableViewCellSelectionStyleNone;
C代码  收藏代码
  1. //如何设置tableview  每行之间的 分割线
  2. self.tableView.separatorStyle=UITableViewCellSeparatorStyleSingleLine;
  3. //如果不需要分割线,那么就设置属性为 UITableViewCellSeparatorStyleNone  即可。

 

C代码  收藏代码
  1. //如何设置 tableview cell的背景颜色
  2. – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  3. {
  4.         //设置背景颜色
  5.         cell.contentView.backgroundColor=[UIColor colorWithRed:0.957 green:0.957 blue:0.957 alpha:1];
  6. }
C代码  收藏代码
  1. – (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
  2. //这个函数响应,用户点击cell 右边的 箭头(如果有的话)
C代码  收藏代码
  1. //如何设置tableview 可以被编辑,首先要进入编辑模式:
  2. [TableView setEditing:YES animated:YES];

如果要退出编辑模式,肯定就是设置为NO

 

C代码  收藏代码
  1. – (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
  2. //返回当前cell  要执行的是哪种编辑,下面的代码是 返回 删除  模式
C代码  收藏代码
  1. – (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
  2. {
  3.     return UITableViewCellEditingStyleDelete;
  4. }
C代码  收藏代码
  1. -(void) tableView:(UITableView *)aTableView commitEditingStyle:(UITableViewCellEditingStyle) editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
  2. //通知告诉用户编辑了 哪个cell,对应上面的代码,我们在这个函数里面执行删除cell的操作。
C代码  收藏代码
  1. -(void) tableView:(UITableView *)aTableView
  2. commitEditingStyle:(UITableViewCellEditingStyle) editingStyle
  3. forRowAtIndexPath:(NSIndexPath *)indexPath
  4. {
  5.         [chatArray  removeObjectAtIndex:indexPath.row];
  6.     [chatTableView  reloadData];
  7. }
C代码  收藏代码
  1. – (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
  2. //获得 某一行的CELL对象
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s