年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3166|回复: 0

[实用控件] ios实战开发之UITableView应用(商品展示2)

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-4-2 15:18:01 | 显示全部楼层 |阅读模式
    1、效果演示:



    2、过程分析:

    2.1、用storyboard画出基本界面图示:

    QQ20140402-1@2x.png

    2.2、创建UITableView--(View)
    2.3、从文件中读取出数据源、抽象模型对象--(Model)
    2.4、设置当前控制器为数据源及UITableView的代理实现相关方法--(Control)
    以上三点即ios开发的MVC模型

    3、关键代码:
    SACar.h
    1. //
    2. //  SACar.h
    3. //  UITableView-3
    4. //
    5. //  Created by yusian on 14-4-1.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <Foundation/Foundation.h>
    9. @interface SACar : NSObject
    10. @property (nonatomic, copy) NSString *name;     // 数据模型汽车名称
    11. @property (nonatomic, copy) NSString *icon;     // 数据模型汽车图片
    12. @property (nonatomic, copy) NSString *desc;     // 数据模型汽车描述
    13. + (id)carWithDict:(NSDictionary *)dict;         // 类构造方法快速创建模型
    14. - (id)initWithDict:(NSDictionary *)dict;        // 对象构造方法快速创建模型
    15. @end
    复制代码
    SACar.m
    1. //
    2. //  SACar.m
    3. //  UITableView-3
    4. //
    5. //  Created by yusian on 14-4-1.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "SACar.h"
    9. @implementation SACar
    10. + (id)carWithDict:(NSDictionary *)dict
    11. {
    12.     return [[self alloc] initWithDict:dict];
    13. }
    14. - (id)initWithDict:(NSDictionary *)dict
    15. {
    16.     if (self = [super init]) {
    17.         
    18.         self.name = dict[@"name"];
    19.         self.icon = dict[@"icon"];
    20.         self.desc = dict[@"desc"];
    21.     }
    22.     return self;
    23. }
    24. @end
    复制代码
    SAViewController.h
    1. //
    2. //  SAViewController.h
    3. //  UITableView-3
    4. //
    5. //  Created by yusian on 14-4-1.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import <UIKit/UIKit.h>
    9. #import "SACar.h"
    10. @interface SAViewController : UIViewController
    11. @property (weak, nonatomic) IBOutlet UITableView *tableView;        // UITableView
    12. @property (weak, nonatomic) IBOutlet UILabel *titleLable;           // 标题栏,显示"汽车展示"或"已选择n个"
    13. @property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;   // 删除按钮
    14. - (IBAction)remove:(UIBarButtonItem *)sender;                       // 删除按钮事件
    15. - (IBAction)antiElection:(UIBarButtonItem *)sender;                 // 反选按钮事件
    16. @end
    复制代码
    SAViewController.m
    1. //
    2. //  SAViewController.m
    3. //  UITableView-3
    4. //
    5. //  Created by yusian on 14-4-1.
    6. //  Copyright (c) 2014年 yusian. All rights reserved.
    7. //
    8. #import "SAViewController.h"
    9. #define kCarCounts 20
    10. #define kCellHeight 60
    11. @interface SAViewController () <UITableViewDataSource, UITableViewDelegate>
    12. {
    13.     // 两个全局可变数组,一个用来存储所有SACar对象与临时SACar对象
    14.     NSMutableArray  *_cars;
    15.     NSMutableArray  *_selectedCars;
    16. }
    17. @end
    18. @implementation SAViewController
    19. #pragma mark View加载完后调用
    20. - (void)viewDidLoad
    21. {
    22.     [super viewDidLoad];
    23.    
    24.     _cars = [NSMutableArray array];             // 数组初始化
    25.     _selectedCars = [NSMutableArray array];     // 数组初始化
    26.     self.tableView.dataSource = self;           // tableview的数据源为当前控制器
    27.     self.tableView.delegate = self;             // tableview的代码为当前控制器
    28.    
    29.     // 用数组将文件中的内容取出,再通过模型格式化保存到全局数组_cars中,循环取值,抽象kCarCounts个对象做为数据源
    30.     NSString *path = [[NSBundle mainBundle] pathForResource:@"Des.plist" ofType:nil];
    31.     NSArray *data = [[NSArray alloc] initWithContentsOfFile:path];
    32.     for (int i = 0; i < kCarCounts; i++) {
    33.         SACar *car = [SACar carWithDict:data[i % data.count]];
    34.         [_cars addObject:car];
    35.     }
    36. }
    37. #pragma mark 返回表格行数-UITableViewDataSource协议方法(必须实现)
    38. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    39. {
    40.     // 由于该方法在表格刷新时调用,所以某此与表格刷新相关的事件处理可以放到该方法中来处理
    41.     if (_selectedCars.count) {
    42.         self.titleLable.text = [NSString stringWithFormat:@"已选中 %d 个", _selectedCars.count];    // ToolBar上lable动态文字显示
    43.         self.removeItem.enabled = YES;  // 删除按钮的可用性
    44.     } else {
    45.         self.titleLable.text = @"汽车展示";
    46.         self.removeItem.enabled = NO;
    47.     }
    48.     return _cars.count; // 返回数据源对象个数即表格行数;
    49. }
    50. #pragma mark 返回对应行表格内容-UITableViewTableDataSource协议方法(必须实现)
    51. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    52. {
    53.     // 变量定义或初始化
    54.     static NSString *ID = @"cell";
    55.     SACar *car = _cars[indexPath.row];
    56.     UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:ID];  // 如果缓存中有带ID标记的cell则直接回收利用
    57.    
    58.     // 如果没有,则自己初始化并做标记以备后续能循环利用
    59.     if (nil == cell) {
    60.         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    61.     }
    62.    
    63.     // 无论是缓存回收还是新创建的cell内容都必须重新赋值,循环利用只能解决是否需要新创建的问题,出发点在性能
    64.     cell.imageView.image = [UIImage imageNamed:car.icon];       // 将模型icon数据解析到表格cell的image中
    65.     cell.textLabel.text = car.name;                             // 将模型name数据解析到表格cell的textLabel中
    66.     cell.detailTextLabel.text = car.desc;                       // 将模型desc数据解析到表格cell的detailTetLabel中
    67.     cell.detailTextLabel.textColor = [UIColor lightGrayColor];  // 设置cell中detailTextLabel颜色
    68.    
    69.     // 以下判断该当前cell是否需要打勾,与后续功能实现相关
    70.     // 如果当前模型数据在临时数组中则该cell显示打勾
    71.     if ([_selectedCars containsObject:car]) {
    72.         cell.accessoryType = UITableViewCellAccessoryCheckmark; // 打勾
    73.     } else {
    74.         cell.accessoryType = UITableViewCellAccessoryNone;      // 去掉打勾
    75.     }
    76.    
    77.     return cell;
    78. }
    79. #pragma mark 返回表格高度--UITableViewDelegate协议方法
    80. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    81. {
    82.     return kCellHeight;                                         // cell高度
    83. }
    84. #pragma mark cell触摸事件响应--UITableViewDelegate协议方法
    85. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    86. {
    87.     SACar *car = _cars[indexPath.row];
    88.    
    89.     // 基本处理思想:当触摸当前cell时将当前cell的模型对象添加到数组,实现打勾
    90.     // 如果已经存在数组说明之前有触摸,则从数组中删除,实现去掉打勾
    91.     if ([_selectedCars containsObject:car]) {
    92.         [_selectedCars removeObject:car];
    93.     } else {
    94.         [_selectedCars addObject:car];
    95.     }
    96.    
    97.     // 局部刷新,只刷新当前单元格
    98.     [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    99. }
    100. #pragma mark 删除按钮事件响应
    101. - (IBAction)remove:(UIBarButtonItem *)sender {
    102.    
    103.     // 遍历临时数组,即将删除的模型对象全部取出,并将模型对象对应cell的indexPath保存到一个数组,方便局部刷新使用
    104.     // 如果全局刷新则不需要该步骤
    105.     NSMutableArray *array = [NSMutableArray array];
    106.     for (SACar *c in _selectedCars) {
    107.         NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[_cars indexOfObject:c] inSection:0];
    108.         [array addObject:indexPath];
    109.     }
    110.    
    111.     [_cars removeObjectsInArray:_selectedCars];     // 数据源中删除已选中需要删除的模型对象
    112.     [_selectedCars removeAllObjects];               // 临时数组清空,准备下次使用
    113.    
    114.     [self.tableView deleteRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationRight];    // 局部刷新
    115.     // [self.tableView reloadData];                 // 全局刷新
    116.    
    117. }
    118. #pragma mark 反选按钮事件响应
    119. - (IBAction)antiElection:(UIBarButtonItem *)sender {
    120.    
    121.     // 基本思想:1、全部模型-已选择模型=未选择模型;2、将(未选择模型)替换(已选择模型),实现反选
    122.     NSMutableArray *array = [NSMutableArray arrayWithArray:_cars];
    123.     [array removeObjectsInArray:_selectedCars];
    124.     _selectedCars = array;
    125.    
    126.     [self.tableView reloadData];    // 全局刷新
    127. }
    128. @end
    复制代码
    4、源代码下载:
    游客,本帖隐藏的内容需要积分高于 1 才可浏览,您当前积分为 0
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-4-27 15:59 , Processed in 0.058765 second(s), 26 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表