zoukankan      html  css  js  c++  java
  • iOS UI-表格控制器(UITableView)-基本使用

    tableView的常见属性

     cell的常见属性

     一、一般情况

     1 #import "ViewController.h"
     2 
     3 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
     4 
     5 @property (strong, nonatomic) UITableView *tableview;
     6 
     7 @property (strong, nonatomic) NSArray *dataSource;
     8 
     9 @end
    10 
    11 /*
    12  UITableView
    13  表格视图:两个协议,两个代理,四个方法
    14  
    15  两个协议:
    16  1.数据源协议:(提供表格数据,提供表格内容)UITableViewDataSource
    17  2.执行代理协议:(提供表格操作方法)UITableViewDelegate
    18  */
    19 
    20 
    21 @implementation ViewController
    22 
    23 #pragma mark - LifeCircle
    24 - (void)viewDidLoad {
    25     [super viewDidLoad];
    26     
    27     [self.view setBackgroundColor:[UIColor groupTableViewBackgroundColor]];
    28     
    29     self.tableview = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, 375, 400) style:UITableViewStyleGrouped];
    30     
    31     self.tableview.delegate = self;
    32     self.tableview.dataSource = self;
    33     
    34     [self.view addSubview:self.tableview];
    35     
    36     NSArray *arr1 = @[@"芃,你好1",@"芃,你好2",@"芃,你好3",@"芃,你好4",@"芃,你好5"];
    37     NSArray *arr2 = @[@"芃,你好6",@"芃,你好7",@"芃,你好8",@"芃,你好9"];
    38     self.dataSource = @[arr1,arr2];
    39     
    40     
    41 }
    42 
    43 #pragma mark - UITableViewDataSource
    44 //组数
    45 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    46 {
    47     return [self.dataSource count];
    48 }
    49 
    50 //设置每组行数
    51 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    52 {
    53     return [[self.dataSource objectAtIndex:section] count];
    54 }
    55 
    56 // 设置[每一个]单元格方法
    57 // 1.设置复用[单元格]ID
    58 // 2.设置复用
    59 // 3.创建单元格
    60 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    61 {
    62     // 1.设置复用[单元格]ID
    63     static NSString *cellIdentifier = @"cellIdentifier";
    64     // 2.设置复用
    65     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    66     // 3.创建单元格
    67     if (!cell) {
    68         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    69     }
    70     cell.textLabel.text = [[self.dataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
    71     cell.imageView.image = [UIImage imageNamed:@"1.jpg"];
    72     cell.detailTextLabel.text = @"张芃芃的信息";
    73     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    74 
    75     
    76     return cell;
    77 }
    78 
    79 #pragma mark - UITableViewDelegate
    80 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    81 {
    82     //拿到点击的那一行
    83     UITableViewCell *selectCell = [tableView cellForRowAtIndexPath:indexPath];
    84     
    85     NSString *titleInRow = [NSString stringWithFormat:@"%@",selectCell.textLabel.text];
    86     
    87 //    NSString *titleInRow = [NSString stringWithFormat:@"%@",[[self.dataSource objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]];
    88     
    89     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"问候" message:titleInRow delegate:self cancelButtonTitle:@"你好" otherButtonTitles: nil];
    90     [alert show];
    91 }
    92 
    93 @end

     二、通过加载plist文件显示分组数据

      1 #import <Foundation/Foundation.h>
      2 
      3 @interface Group : NSObject
      4 //组标题
      5 @property (copy, nonatomic) NSString *title;
      6 //组描述
      7 @property (copy, nonatomic) NSString *desc;
      8 //汽车品牌信息
      9 @property (strong, nonatomic) NSArray *cars;
     10 
     11 - (instancetype) initWithDict:(NSDictionary *)dict;
     12 + (instancetype) groupWithDict:(NSDictionary *)dict;
     13 
     14 @end
     15 
     16 
     17 #import "Group.h"
     18 
     19 @implementation Group
     20 
     21 - (instancetype)initWithDict:(NSDictionary *)dict
     22 {
     23     self = [super init];
     24     if (self) {
     25 //        self.title = dict[@"title"];
     26 //        self.desc = dict[@"desc"];
     27 //        self.cars = dict[@"cars"];
     28         [self setValuesForKeysWithDictionary:dict];
     29     }
     30     return self;
     31 }
     32 
     33 + (instancetype)groupWithDict:(NSDictionary *)dict
     34 {
     35     return [[self alloc] initWithDict:dict];
     36 }
     37 
     38 @end
     39 
     40 
     41 #import "ViewController.h"
     42 #import "Group.h"
     43 
     44 @interface ViewController ()<UITableViewDataSource>
     45 
     46 @property (strong, nonatomic) NSArray *groups;
     47 @property (strong, nonatomic) UITableView *tableView;
     48 
     49 @end
     50 
     51 @implementation ViewController
     52 
     53 - (void)viewDidLoad {
     54     [super viewDidLoad];
     55     self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds];
     56     self.tableView.dataSource = self;
     57     [self.view addSubview:self.tableView];
     58     
     59 }
     60 
     61 #pragma mark - 数据源协议
     62 
     63 //设置组数
     64 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
     65 {
     66     return [self.groups count];
     67 }
     68 //设置每组行数
     69 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
     70 {
     71     Group *group = self.groups[section];
     72     return group.cars.count;
     73     
     74 }
     75 //设置每组每行内容
     76 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
     77 {
     78     //1.设置复用单元格ID
     79     static NSString *cellIdentifier = @"cellIdentifier";
     80     //2.设置复用
     81     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
     82     //3.创建单元格
     83     if (!cell) {
     84         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
          }

                // 3.1获取模型数据
     86         //获取模型
     87         Group *group = self.groups[indexPath.section];
     88         //获取对应的汽车品牌
     89         NSString *brand = group.cars[indexPath.row];
     90         // 3.2把模型中的数据设置给单元格中的子控件
     91         cell.textLabel.text = brand;
     92 93     
     94     return cell;
     95 }
     96 
     97 //组标题
     98 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
     99 {
    100     Group *group = self.groups[section];
    101     return group.title;
    102 }
    103 //设置组尾
    104 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
    105 {
    106     Group *group = self.groups[section];
    107     return group.desc;
    108 }
    109 
    110 
    111 #pragma mark - 懒加载
    112 - (NSArray *)groups
    113 {
    114     if (_groups == nil) {
    115         // 1.找到plist文件的路径
    116         NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_simple.plist" ofType:nil];
    117         // 2.加载plist文件
    118         NSArray *array = [NSArray arrayWithContentsOfFile:path];
    119         // 3.字典转模型
    120         NSMutableArray *arrayModel = [NSMutableArray array];
    121         // 4.遍历字典数组中的每个字典,把每个字典转成模型,把模型放到arrayModel
    122         for (NSDictionary *tempDict in array) {
    123             //创建模型对象
    124             Group *model = [[Group alloc] initWithDict:tempDict];
    125             [arrayModel addObject:model];
    126         }
    127         _groups =arrayModel;
    128         
    129     }
    130     return _groups;
    131 }
    132 
    133 #pragma mark - 设置状态栏文字的颜色
    134 - (UIStatusBarStyle)preferredStatusBarStyle
    135 {
    136     return UIStatusBarStyleLightContent;
    137 }
    138 
    139 #pragma mark - 隐藏状态栏
    140 - (BOOL)prefersStatusBarHidden
    141 {
    142     return YES;
    143 }
    144 
    145 - (void)didReceiveMemoryWarning {
    146     [super didReceiveMemoryWarning];
    147     // Dispose of any resources that can be recreated.
    148 }
    149 
    150 @end

    三、通过加载plist文件展示单组数据 

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface HMLOL : NSObject
     4 @property (nonatomic, copy) NSString *icon;
     5 @property (nonatomic, copy) NSString *name;
     6 @property (nonatomic, copy) NSString *intro;
     7 
     8 - (instancetype)initWithDict:(NSDictionary *)dict;
     9 + (instancetype)lolWithDict:(NSDictionary *)dict;
    10 @end
    11 
    12 #import "HMLOL.h"
    13 
    14 @implementation HMLOL
    15 - (instancetype)initWithDict:(NSDictionary *)dict
    16 {
    17     self = [super init];
    18     if (self) {
    19         [self setValuesForKeysWithDictionary:dict];
    20     }
    21     return self;
    22 }
    23 
    24 + (instancetype)lolWithDict:(NSDictionary *)dict {
    25     return [[self alloc] initWithDict:dict];
    26 }
    27 @end
    28 
    29 
    30 #import "ViewController.h"
    31 #import "HMLOL.h"
    32 @interface ViewController ()<UITableViewDataSource>
    33 @property (weak, nonatomic) IBOutlet UITableView *tableView;
    34 // 存放所有模型数据
    35 @property (nonatomic, strong) NSArray *heroes;
    36 @end
    37 
    38 @implementation ViewController
    39 
    40 - (void)viewDidLoad {
    41     [super viewDidLoad];
    42     
    43     // 1.设置数据源
    44     self.tableView.dataSource = self;
    45 }
    46 
    47 
    48 // 
    49 //- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    50 //    return 1;
    51 //}
    52 
    53 // 返回多少行
    54 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    55     return self.heroes.count;
    56 }
    57 
    58 
    59 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    60     // 1.创建cell
    61     UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    62     
    63     // 2.取出模型中的数据设置给cell
    64     HMLOL *hero = self.heroes[indexPath.row];
    65     // cell内部显示内容的三个子控件
    66     cell.textLabel.text = hero.name;
    67     cell.imageView.image = [UIImage imageNamed:hero.icon];
    68     cell.detailTextLabel.text = hero.intro;
    69     
    70     // 设置辅助视图的样式
    71 //    cell.accessoryType = UITableViewCellAccessoryNone;
    72     // 设置自定义的辅助视图
    73 //    cell.accessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
    74     // 3.返回给tabelView
    75     return cell;
    76 }
    77 
    78 
    79 #pragma mark - 懒加载
    80 - (NSArray *)heroes {
    81     if (_heroes == nil) {
    82         NSArray *dictArr = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"heros.plist" ofType:nil]];
    83         NSMutableArray *arrM = [NSMutableArray arrayWithCapacity:dictArr.count];
    84         for (NSDictionary *dict in dictArr) {
    85             HMLOL *hero = [HMLOL lolWithDict:dict];
    86             [arrM addObject:hero];
    87         }
    88         _heroes = arrM;
    89     }
    90     return _heroes;
    91 }
    92 @end

    四、汽车品牌展示

      1 #import <UIKit/UIKit.h>
      2 
      3 @interface BWCar : UIView
      4 @property (nonatomic, copy) NSString *name;
      5 @property (nonatomic, copy) NSString *icon;
      6 
      7 -(instancetype) initWithDict:(NSDictionary *)dict;
      8 +(instancetype) carWithDict:(NSDictionary *)dict;
      9 
     10 @end
     11 
     12 #import "BWCar.h"
     13 
     14 @implementation BWCar
     15 
     16 - (instancetype)initWithDict:(NSDictionary *)dict
     17 {
     18     if (self = [super init]) {
     19         [self setValuesForKeysWithDictionary:dict];
     20     }
     21     return self;
     22 }
     23 
     24 + (instancetype)carWithDict:(NSDictionary *)dict
     25 {
     26     return [[self alloc] initWithDict:dict];
     27 }
     28 
     29 @end
     30 
     31 
     32 
     33 #import <UIKit/UIKit.h>
     34 
     35 @interface BWGroup : UIView
     36 
     37 @property (nonatomic, copy) NSString *title;
     38 @property (nonatomic, strong) NSArray *cars;
     39 
     40 - (instancetype) initWithDict:(NSDictionary *)dict;
     41 + (instancetype) groupWithDict:(NSDictionary *)dict;
     42 
     43 @end
     44 
     45 #import "BWGroup.h"
     46 #import "BWCar.h"
     47 
     48 @implementation BWGroup
     49 
     50 - (instancetype)initWithDict:(NSDictionary *)dict
     51 {
     52     if (self = [super init]) {
     53         [self setValuesForKeysWithDictionary:dict];
     54         //当有模型嵌套的时候需要手动把字典转模型
     55         //模型数组
     56         NSMutableArray *arrayModels = [NSMutableArray array];
     57         //字典转模型
     58         for (NSDictionary *tempDict in self.cars) {
     59             BWCar *model = [[BWCar alloc] initWithDict:tempDict];
     60             [arrayModels addObject:model];
     61         }
     62         self.cars = arrayModels;
     63     }
     64 
     65     return self;
     66 }
     67 
     68 + (instancetype)groupWithDict:(NSDictionary *)dict
     69 {
     70     return [[self alloc] initWithDict:dict];
     71 }
     72 
     73 @end
     74 
     75 #import "ViewController.h"
     76 #import "BWCar.h"
     77 #import "BWGroup.h"
     78 
     79 
     80 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>
     81 
     82 @property (nonatomic, strong) NSArray *groups;
     83 @property (nonatomic, strong) UITableView *tableView;
     84 @property (nonatomic, strong) NSIndexPath *indexPath;
     85 
     86 @end
     87 
     88 @implementation ViewController
     89 
     90 #pragma mark - 懒加载数据
     91 - (NSArray *)groups
     92 {
     93     if (_groups == nil) {
     94         
     95         NSString *path = [[NSBundle mainBundle] pathForResource:@"cars_total.plist" ofType:nil];
     96         NSArray *arr = [NSArray arrayWithContentsOfFile:path];
     97         NSMutableArray *arrayModels = [NSMutableArray array];
     98         for (NSDictionary *dict in arr) {
     99             BWGroup *group = [BWGroup groupWithDict:dict];
    100             [arrayModels addObject:group];
    101         }
    102         _groups = arrayModels;
    103     }
    104     return _groups;
    105 }
    106 
    107 - (void)viewDidLoad {
    108     [super viewDidLoad];
    109     
    110     self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStyleGrouped];
    111     self.tableView.dataSource =self;
    112     self.tableView.delegate =self;
    113     
    114     [self.view addSubview:self.tableView];
    115     
    116     
    117 }
    118 #pragma mark - 数据源方法
    119 //加载数组数
    120 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    121 {
    122     return self.groups.count;
    123 }
    124 //加载每组行数
    125 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    126 {
    127     BWGroup *group = [self.groups objectAtIndex:section];
    128     return group.cars.count;
    129 }
    130 
    131 //加载单元格数据
    132 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    133 {
    134     // 1.创建单元格
    135     
    136     // 1.1 声明重用ID
    137     static NSString *cellIdentifier = @"cellIdentifier";
    138     // 1.2 根据重用ID去缓存池中取对应的cell对象
    139     UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    140     // 1.3 如果没有取到,就创建一个cell
    141     if (!cell) {
    142         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    143     }
    144     // 2.设置单元格内容
    145     
    146     // 2.1 取数据模型
    147     BWGroup *group = self.groups[indexPath.section];
    148     BWCar *car = group.cars[indexPath.row];
    149     
    150     // 2.2 加载单元格内容
    151     cell.textLabel.text = car.name;
    152     cell.imageView.image = [UIImage imageNamed:car.icon];
    153     
    154     // 3.返回单元格
    155     return cell;
    156 }
    157 
    158 //加载组标题
    159 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    160 {
    161     BWGroup *group = [self.groups objectAtIndex:section];
    162     return group.title;
    163 }
    164 
    165 //设置右侧索引兰
    166 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    167 {
    168     return [self.groups valueForKey:@"title"];
    169 }
    170 
    171 
    172 
    173 #pragma mark - 代理方法
    174 //监听行被选中的代理方法
    175 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    176 {
    177     //引用indexPath
    178     self.indexPath = indexPath;
    179 
    180     //获取当前被选中行的车的对象
    181     BWGroup *group = self.groups[indexPath.section];
    182     BWCar *car = group.cars[indexPath.row];
    183     
    184     //创建一个对话框对象
    185     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"编辑" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定",nil];
    186     
    187 
    188     
    189     //修改UIAlertView的样式
    190     alert.alertViewStyle = UIAlertViewStylePlainTextInput;
    191     //获取那个文本框,并且设置文本框中的文字为car.name
    192     [alert textFieldAtIndex:0].text = car.name;
    193     //显示对话框
    194     [alert show];
    195 }
    196 //UIAlertView的按钮被点击了,就会执行
    197 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    198 {
    199     //表示点击的是"确定"
    200     if (buttonIndex == 1) {
    201         // 更新数据
    202         // 1.获取用户文本框中的内容
    203         NSString *name = [alertView textFieldAtIndex:0].text;
    204         
    205         // 2.找到对应的车模型
    206 //        BWCar *car = self.groups[alertView.tag];
    207         BWGroup *group = self.groups[self.indexPath.section];
    208         BWCar *car = group.cars[self.indexPath.row];
    209        // NSLog(@"%@",self.indexPath);
    210         
    211         // 3.修改车模型的name
    212         car.name = name;
    213         
    214         // 4.刷新tableView(重新调用UITableView的数据源对象中的数据源方法)
    215         
    216         // reloadData刷新整个tableView
    217 //        [self.tableView reloadData];
    218         
    219         //局部刷新
    220         //创建一个行对象
    221         NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.indexPath.row inSection:self.indexPath.section];
    222         [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
    223     }
    224 }
    225 
    226 @end

     五、UITableView的API

      1 //
      2 //  UITableView.h
      3 //  UIKit
      4 //
      5 //  Copyright (c) 2005-2014 Apple Inc. All rights reserved.
      6 //
      7 
      8 #import <Foundation/Foundation.h>
      9 #import <CoreGraphics/CoreGraphics.h>
     10 #import <UIKit/UIScrollView.h>
     11 #import <UIKit/UISwipeGestureRecognizer.h>
     12 #import <UIKit/UITableViewCell.h>
     13 #import <UIKit/UIKitDefines.h>
     14 
     15 typedef NS_ENUM(NSInteger, UITableViewStyle) {
     16     UITableViewStylePlain,                  // regular table view
     17     UITableViewStyleGrouped                 // preferences style table view
     18 };
     19 
     20 typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
     21     UITableViewScrollPositionNone,
     22     UITableViewScrollPositionTop,    
     23     UITableViewScrollPositionMiddle,   
     24     UITableViewScrollPositionBottom
     25 };                // scroll so row of interest is completely visible at top/center/bottom of view
     26 
     27 typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
     28     UITableViewRowAnimationFade,
     29     UITableViewRowAnimationRight,           // slide in from right (or out to right)
     30     UITableViewRowAnimationLeft,
     31     UITableViewRowAnimationTop,
     32     UITableViewRowAnimationBottom,
     33     UITableViewRowAnimationNone,            // available in iOS 3.0
     34     UITableViewRowAnimationMiddle,          // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
     35     UITableViewRowAnimationAutomatic = 100  // available in iOS 5.0.  chooses an appropriate animation style for you
     36 };
     37 
     38 // Including this constant string in the array of strings returned by sectionIndexTitlesForTableView: will cause a magnifying glass icon to be displayed at that location in the index.
     39 // This should generally only be used as the first title in the index.
     40 UIKIT_EXTERN NSString *const UITableViewIndexSearch NS_AVAILABLE_IOS(3_0);
     41 
     42 // Returning this value from tableView:heightForHeaderInSection: or tableView:heightForFooterInSection: results in a height that fits the value returned from
     43 // tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil.
     44 UIKIT_EXTERN const CGFloat UITableViewAutomaticDimension NS_AVAILABLE_IOS(5_0);
     45 
     46 @class UITableView;
     47 @class UINib;
     48 @protocol UITableViewDataSource;
     49 @class UILongPressGestureRecognizer;
     50 @class UITableViewHeaderFooterView;
     51 @class UIRefreshControl;
     52 @class UIVisualEffect;
     53 
     54 typedef NS_ENUM(NSInteger, UITableViewRowActionStyle) {
     55     UITableViewRowActionStyleDefault = 0,
     56     UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault,
     57     UITableViewRowActionStyleNormal
     58 } NS_ENUM_AVAILABLE_IOS(8_0);
     59 
     60 NS_CLASS_AVAILABLE_IOS(8_0) @interface UITableViewRowAction : NSObject <NSCopying>
     61 
     62 + (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;
     63 
     64 @property (nonatomic, readonly) UITableViewRowActionStyle style;
     65 @property (nonatomic, copy) NSString *title;
     66 @property (nonatomic, copy) UIColor *backgroundColor; // default background color is dependent on style
     67 @property (nonatomic, copy) UIVisualEffect* backgroundEffect;
     68 
     69 @end
     70 
     71 //_______________________________________________________________________________________________________________
     72 // this represents the display and behaviour of the cells.
     73 
     74 @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
     75 
     76 @optional
     77 
     78 // Display customization
     79 
     80 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
     81 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
     82 - (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
     83 - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
     84 - (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
     85 - (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
     86 
     87 // Variable height support
     88 
     89 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
     90 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
     91 - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
     92 
     93 // Use the estimatedHeight methods to quickly calcuate guessed values which will allow for fast load times of the table.
     94 // If these methods are implemented, the above -tableView:heightForXXX calls will be deferred until views are ready to be displayed, so more expensive logic can be placed there.
     95 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);
     96 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
     97 - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
     98 
     99 // Section header & footer information. Views are preferred over title should you decide to provide both
    100 
    101 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   // custom view for header. will be adjusted to default or specified header height
    102 - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;   // custom view for footer. will be adjusted to default or specified footer height
    103 
    104 // Accessories (disclosures). 
    105 
    106 - (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0);
    107 - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
    108 
    109 // Selection
    110 
    111 // -tableView:shouldHighlightRowAtIndexPath: is called when a touch comes down on a row. 
    112 // Returning NO to that message halts the selection process and does not cause the currently selected row to lose its selected look while the touch is down.
    113 - (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
    114 - (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
    115 - (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
    116 
    117 // Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.
    118 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    119 - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
    120 // Called after the user changes the selection.
    121 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
    122 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
    123 
    124 // Editing
    125 
    126 // Allows customization of the editingStyle for a particular cell located at 'indexPath'. If not implemented, all editable cells will have UITableViewCellEditingStyleDelete set for them when the table has editing property set to YES.
    127 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
    128 - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
    129 - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0); // supercedes -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil
    130 
    131 // Controls whether the background is indented while editing.  If not implemented, the default is YES.  This is unrelated to the indentation level below.  This method only applies to grouped style table views.
    132 - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;
    133 
    134 // The willBegin/didEnd methods are called whenever the 'editing' property is automatically changed by the table (allowing insert/delete/move). This is done by a swipe activating a single row
    135 - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
    136 - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;
    137 
    138 // Moving/reordering
    139 
    140 // Allows customization of the target row for a particular row as it is being moved/reordered
    141 - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;               
    142 
    143 // Indentation
    144 
    145 - (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; // return 'depth' of row for hierarchies
    146 
    147 // Copy/Paste.  All three methods must be implemented by the delegate.
    148 
    149 - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0);
    150 - (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0);
    151 - (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender NS_AVAILABLE_IOS(5_0);
    152 
    153 @end
    154 
    155 UIKIT_EXTERN NSString *const UITableViewSelectionDidChangeNotification;
    156 
    157 
    158 //_______________________________________________________________________________________________________________
    159 
    160 NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableView : UIScrollView <NSCoding>
    161 
    162 - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;                // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
    163 
    164 @property (nonatomic, readonly) UITableViewStyle           style;
    165 @property (nonatomic, assign)   id <UITableViewDataSource> dataSource;
    166 @property (nonatomic, assign)   id <UITableViewDelegate>   delegate;
    167 @property (nonatomic)          CGFloat                     rowHeight;             // will return the default value if unset
    168 @property (nonatomic)          CGFloat                     sectionHeaderHeight;   // will return the default value if unset
    169 @property (nonatomic)          CGFloat                     sectionFooterHeight;   // will return the default value if unset
    170 @property (nonatomic)          CGFloat                     estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate
    171 @property (nonatomic)          CGFloat                     estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate
    172 @property (nonatomic)          CGFloat                     estimatedSectionFooterHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate
    173 @property (nonatomic)          UIEdgeInsets                separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // allows customization of the frame of cell separators
    174 
    175 @property(nonatomic, readwrite, retain) UIView *backgroundView NS_AVAILABLE_IOS(3_2); // the background view will be automatically resized to track the size of the table view.  this will be placed as a subview of the table view behind all cells and headers/footers.  default may be non-nil for some devices.
    176 
    177 // Data
    178 
    179 - (void)reloadData;                 // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks
    180 - (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0);   // reloads the index bar.
    181 
    182 // Info
    183 
    184 - (NSInteger)numberOfSections;
    185 - (NSInteger)numberOfRowsInSection:(NSInteger)section;
    186 
    187 - (CGRect)rectForSection:(NSInteger)section;                                    // includes header, footer and all rows
    188 - (CGRect)rectForHeaderInSection:(NSInteger)section;
    189 - (CGRect)rectForFooterInSection:(NSInteger)section;
    190 - (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;
    191 
    192 - (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;                         // returns nil if point is outside of any row in the table
    193 - (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;                      // returns nil if cell is not visible
    194 - (NSArray *)indexPathsForRowsInRect:(CGRect)rect;                              // returns nil if rect not valid 
    195 
    196 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;            // returns nil if cell is not visible or index path is out of range
    197 - (NSArray *)visibleCells;
    198 - (NSArray *)indexPathsForVisibleRows;
    199 - (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    200 - (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
    201 
    202 - (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
    203 - (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;
    204 
    205 // Row insertion/deletion/reloading.
    206 
    207 - (void)beginUpdates;   // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable
    208 - (void)endUpdates;     // only call insert/delete/reload calls or change the editing state inside an update block.  otherwise things like row count, etc. may be invalid.
    209 
    210 - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    211 - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
    212 - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
    213 - (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);
    214 
    215 - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    216 - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
    217 - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
    218 - (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);
    219 
    220 // Editing. When set, rows show insert/delete/reorder controls based on data source queries
    221 
    222 @property (nonatomic, getter=isEditing) BOOL editing;                             // default is NO. setting is not animated.
    223 - (void)setEditing:(BOOL)editing animated:(BOOL)animated;
    224 
    225 @property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0);  // default is YES. Controls whether rows can be selected when not in editing mode
    226 @property (nonatomic) BOOL allowsSelectionDuringEditing;                                     // default is NO. Controls whether rows can be selected when in editing mode
    227 @property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);                 // default is NO. Controls whether multiple rows can be selected simultaneously
    228 @property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);   // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode
    229 
    230 // Selection
    231 
    232 - (NSIndexPath *)indexPathForSelectedRow;                                                // returns nil or index path representing section and row of selection.
    233 - (NSArray *)indexPathsForSelectedRows NS_AVAILABLE_IOS(5_0); // returns nil or a set of index paths representing the sections and rows of the selection.
    234 
    235 // Selects and deselects rows. These methods will not call the delegate methods (-tableView:willSelectRowAtIndexPath: or tableView:didSelectRowAtIndexPath:), nor will it send out a notification.
    236 - (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
    237 - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;
    238 
    239 // Appearance
    240 
    241 @property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;                                                      // show special section index list on right when row count reaches this value. default is 0
    242 @property (nonatomic, retain) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;                   // color used for text of the section index
    243 @property (nonatomic, retain) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;         // the background color of the section index while not being touched
    244 @property (nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while it is being touched
    245 
    246 @property (nonatomic) UITableViewCellSeparatorStyle separatorStyle; // default is UITableViewCellSeparatorStyleSingleLine
    247 @property (nonatomic, retain) UIColor              *separatorColor UI_APPEARANCE_SELECTOR; // default is the standard separator gray
    248 @property (nonatomic, copy) UIVisualEffect               *separatorEffect NS_AVAILABLE_IOS(8_0) UI_APPEARANCE_SELECTOR; // effect to apply to table separators
    249 
    250 @property (nonatomic, retain) UIView *tableHeaderView;                           // accessory view for above row content. default is nil. not to be confused with section header
    251 @property (nonatomic, retain) UIView *tableFooterView;                           // accessory view below content. default is nil. not to be confused with section footer
    252 
    253 - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier;  // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
    254 - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
    255 - (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);  // like dequeueReusableCellWithIdentifier:, but for headers/footers
    256 
    257 // Beginning in iOS 6, clients can register a nib or class for each cell.
    258 // If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
    259 // Instances returned from the new dequeue method will also be properly sized when they are returned.
    260 - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);
    261 - (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
    262 
    263 - (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
    264 - (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);
    265 
    266 @end
    267 
    268 //_______________________________________________________________________________________________________________
    269 // this protocol represents the data model object. as such, it supplies no information about appearance (including the cells)
    270 
    271 @protocol UITableViewDataSource<NSObject>
    272 
    273 @required
    274 
    275 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    276 
    277 // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
    278 // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
    279 
    280 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    281 
    282 @optional
    283 
    284 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented
    285 
    286 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different
    287 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
    288 
    289 // Editing
    290 
    291 // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable.
    292 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
    293 
    294 // Moving/reordering
    295 
    296 // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:
    297 - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
    298 
    299 // Index
    300 
    301 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")
    302 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;  // tell table which section corresponds to section title/index (e.g. "B",1))
    303 
    304 // Data manipulation - insert and delete support
    305 
    306 // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change
    307 // Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead
    308 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
    309 
    310 // Data manipulation - reorder / moving support
    311 
    312 - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;
    313 
    314 @end
    315 
    316 //_______________________________________________________________________________________________________________
    317 
    318 // This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
    319 @interface NSIndexPath (UITableView)
    320 
    321 + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
    322 
    323 @property(nonatomic,readonly) NSInteger section;
    324 @property(nonatomic,readonly) NSInteger row;
    325 
    326 @end
  • 相关阅读:
    lpc2103 rtc寄存器说明
    LPC21O3第一课:第一个实验,LED灯闪烁及ADS1.2的初步使用
    把FlvJoiner更新了一下
    Boost智能指针——weak_ptr
    买了一个USB无线网卡
    Boost的转换函数(二)
    把FlvDownloader更新了一下
    在C#中快速实现拖放操作
    Flv视频分割软件FlvSplitter发布
    用Apatch给Messenger去广告
  • 原文地址:https://www.cnblogs.com/oc-bowen/p/5098401.html
Copyright © 2011-2022 走看看