Sian 发表于 2014-4-2 15:18:01

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

1、效果演示:

http://player.youku.com/player.php/sid/XNjkzNDIyMDIw/v.swf

2、过程分析:

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



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

3、关键代码:
SACar.h
//
//SACar.h
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface SACar : NSObject

@property (nonatomic, copy) NSString *name;   // 数据模型汽车名称

@property (nonatomic, copy) NSString *icon;   // 数据模型汽车图片

@property (nonatomic, copy) NSString *desc;   // 数据模型汽车描述

+ (id)carWithDict:(NSDictionary *)dict;         // 类构造方法快速创建模型

- (id)initWithDict:(NSDictionary *)dict;      // 对象构造方法快速创建模型

@end

SACar.m
//
//SACar.m
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import "SACar.h"

@implementation SACar

+ (id)carWithDict:(NSDictionary *)dict
{
    return [ initWithDict:dict];
}

- (id)initWithDict:(NSDictionary *)dict
{
    if (self = ) {
      
      self.name = dict[@"name"];
      self.icon = dict[@"icon"];
      self.desc = dict[@"desc"];
    }
    return self;
}
@end

SAViewController.h
//
//SAViewController.h
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "SACar.h"

@interface SAViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITableView *tableView;      // UITableView

@property (weak, nonatomic) IBOutlet UILabel *titleLable;         // 标题栏,显示"汽车展示"或"已选择n个"

@property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem;   // 删除按钮

- (IBAction)remove:(UIBarButtonItem *)sender;                     // 删除按钮事件

- (IBAction)antiElection:(UIBarButtonItem *)sender;               // 反选按钮事件
@end

SAViewController.m
//
//SAViewController.m
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//

#import "SAViewController.h"
#define kCarCounts 20
#define kCellHeight 60

@interface SAViewController () <UITableViewDataSource, UITableViewDelegate>
{
    // 两个全局可变数组,一个用来存储所有SACar对象与临时SACar对象
    NSMutableArray*_cars;
    NSMutableArray*_selectedCars;
}
@end

@implementation SAViewController

#pragma mark View加载完后调用
- (void)viewDidLoad
{
    ;
   
    _cars = ;             // 数组初始化
    _selectedCars = ;   // 数组初始化

    self.tableView.dataSource = self;         // tableview的数据源为当前控制器
    self.tableView.delegate = self;             // tableview的代码为当前控制器
   
    // 用数组将文件中的内容取出,再通过模型格式化保存到全局数组_cars中,循环取值,抽象kCarCounts个对象做为数据源
    NSString *path = [ pathForResource:@"Des.plist" ofType:nil];
    NSArray *data = [ initWithContentsOfFile:path];
    for (int i = 0; i < kCarCounts; i++) {
      SACar *car = ];
      ;
    }

}

#pragma mark 返回表格行数-UITableViewDataSource协议方法(必须实现)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // 由于该方法在表格刷新时调用,所以某此与表格刷新相关的事件处理可以放到该方法中来处理
    if (_selectedCars.count) {
      self.titleLable.text = ;    // ToolBar上lable动态文字显示
      self.removeItem.enabled = YES;// 删除按钮的可用性
    } else {
      self.titleLable.text = @"汽车展示";
      self.removeItem.enabled = NO;
    }
    return _cars.count; // 返回数据源对象个数即表格行数;
}

#pragma mark 返回对应行表格内容-UITableViewTableDataSource协议方法(必须实现)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 变量定义或初始化
    static NSString *ID = @"cell";
    SACar *car = _cars;
    UITableViewCell *cell = ;// 如果缓存中有带ID标记的cell则直接回收利用
   
    // 如果没有,则自己初始化并做标记以备后续能循环利用
    if (nil == cell) {
      cell = [ initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
   
    // 无论是缓存回收还是新创建的cell内容都必须重新赋值,循环利用只能解决是否需要新创建的问题,出发点在性能
    cell.imageView.image = ;       // 将模型icon数据解析到表格cell的image中
    cell.textLabel.text = car.name;                           // 将模型name数据解析到表格cell的textLabel中
    cell.detailTextLabel.text = car.desc;                     // 将模型desc数据解析到表格cell的detailTetLabel中
    cell.detailTextLabel.textColor = ;// 设置cell中detailTextLabel颜色
   
    // 以下判断该当前cell是否需要打勾,与后续功能实现相关
    // 如果当前模型数据在临时数组中则该cell显示打勾
    if () {
      cell.accessoryType = UITableViewCellAccessoryCheckmark; // 打勾
    } else {
      cell.accessoryType = UITableViewCellAccessoryNone;      // 去掉打勾
    }
   
    return cell;
}

#pragma mark 返回表格高度--UITableViewDelegate协议方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return kCellHeight;                                       // cell高度
}

#pragma mark cell触摸事件响应--UITableViewDelegate协议方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SACar *car = _cars;
   
    // 基本处理思想:当触摸当前cell时将当前cell的模型对象添加到数组,实现打勾
    // 如果已经存在数组说明之前有触摸,则从数组中删除,实现去掉打勾
    if () {
      ;
    } else {
      ;
    }
   
    // 局部刷新,只刷新当前单元格
    withRowAnimation:UITableViewRowAnimationNone];

}

#pragma mark 删除按钮事件响应
- (IBAction)remove:(UIBarButtonItem *)sender {
   
    // 遍历临时数组,即将删除的模型对象全部取出,并将模型对象对应cell的indexPath保存到一个数组,方便局部刷新使用
    // 如果全局刷新则不需要该步骤
    NSMutableArray *array = ;
    for (SACar *c in _selectedCars) {
      NSIndexPath *indexPath = inSection:0];
      ;
    }
   
    ;   // 数据源中删除已选中需要删除的模型对象
    ;               // 临时数组清空,准备下次使用
   
    ;    // 局部刷新

    // ;               // 全局刷新
   
}

#pragma mark 反选按钮事件响应
- (IBAction)antiElection:(UIBarButtonItem *)sender {
   
    // 基本思想:1、全部模型-已选择模型=未选择模型;2、将(未选择模型)替换(已选择模型),实现反选
    NSMutableArray *array = ;
    ;
    _selectedCars = array;
   
    ;    // 全局刷新
}
@end

4、源代码下载:
**** Hidden Message *****
页: [1]
查看完整版本: ios实战开发之UITableView应用(商品展示2)