Purchase购物车实例分析

源代码下载地址:http://code4app.com/ios/55655def933bf09d328b5141

此源代码从中学到以下四个知识点

第一:关于右边只有一个被选中的效果展现,左边部分代码内容,其是一个列表的形式,橙色为一个视图的效果,当没有被选中时则隐藏起来,这边默认第一个被选中;

单元格BADockCell.h

#import <UIKit/UIKit.h>
@interface BADockCell : UITableViewCell
@property (nonatomic ,weak) NSString *categoryText;
@property (nonatomic ,weak) UILabel *category;
@property (nonatomic ,weak) UIView *viewShow1;
+ (instancetype)cellWithTableView:(UITableView *)tableView;
@end

.m文件内容:

#import "BADockCell.h"
#import "Header.h"
@interface BADockCell ()
@end

@implementation BADockCell

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self =[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UILabel *category =[[UILabel alloc]initWithFrame:(CGRect){0,0,75,50}];
        [self.contentView addSubview:category];
        _category=category;

        UIView *viewShow =[[UIView alloc]initWithFrame:(CGRect){0,49.5,75,0.5}];
        viewShow.backgroundColor=[UIColor blackColor];
        viewShow.alpha=0.4;
        [self.contentView addSubview:viewShow];
        UIView *viewShow1 =[[UIView alloc]initWithFrame:(CGRect){0,0,2,50}];
        viewShow1.backgroundColor=UIColorRGBA(255, 127, 0, 1);
        [self.contentView addSubview:viewShow1];

        viewShow1.hidden=YES;
        _viewShow1=viewShow1;
    }
    return self;
}

-(void)setCategoryText:(NSString *)categoryText
{
    _category.text=categoryText;
    _category.textAlignment=NSTextAlignmentCenter;
    _category.font=Font(16);

}

+ (instancetype)cellWithTableView:(UITableView *)tableView
{
    static NSString *ID = @"BADockCell";
    BADockCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
        cell = [[BADockCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
        //取消选中状态
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    }
    return cell;
}
@end
注意:+ (instancetype)cellWithTableView:(UITableView *)tableView在这边对CELL进行注册,然后在UITableView外面加载列时进行调用BADockCell *cell =[BADockCell cellWithTableView:tableView];
. h文件的内容(继承于UITableView)

#import <UIKit/UIKit.h>
@protocol DockTavleViewDelegate <NSObject>
-(void)dockClickindexPathRow:(NSMutableArray *)row  index:(NSIndexPath *)index indeXPath:(NSIndexPath *)indexPath;
@end

@interface BAWineShoppingDockTavleView : UITableView
@property (nonatomic ,strong) NSMutableArray *dockArray;
@property (weak ,nonatomic) id <DockTavleViewDelegate>dockDelegate;
@end

.m文件的内容

#import "BAWineShoppingDockTavleView.h"
#import "BADockCell.h"
#import "Header.h"
@interface BAWineShoppingDockTavleView ()<UITableViewDelegate,UITableViewDataSource>

@property (nonatomic ,strong) NSIndexPath *path;
@property (nonatomic ,assign) BOOL is;
@end

@implementation BAWineShoppingDockTavleView

-(id)initWithFrame:(CGRect)frame
{
    self =[super initWithFrame:frame];
    if (self) {
        self.dataSource=self;
        self.delegate=self;
    }
    return self;
}

-(void)layoutSubviews
{
    [super layoutSubviews];
    //只让它在初始化运行 运行一次_is就不为空了 给表格进行绑定
    if(!_is)
    {
        NSInteger selectedIndex = 0;
        NSIndexPath *selectedIndexPath = [NSIndexPath indexPathForRow:selectedIndex inSection:0];
        [self tableView:self didSelectRowAtIndexPath:selectedIndexPath];
        _is=YES;
    }
}

-(void)setDockArray:(NSMutableArray *)dockArray
{
    _dockArray=dockArray;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _dockArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //这样方式的加载内容不错
    BADockCell *cell =[BADockCell cellWithTableView:tableView];
    cell.categoryText=_dockArray[indexPath.row][@"dockName"];
    cell.backgroundColor=[UIColor whiteColor];
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (_path!=nil) {
        NSLog(@"上一个被选中%zd",_path.row);
        BADockCell *cell = (BADockCell *)[tableView cellForRowAtIndexPath:_path];
        cell.backgroundColor=[UIColor whiteColor];
        cell.category.textColor=[UIColor blackColor];
        cell.viewShow1.hidden=YES;
    }
    if ([_dockDelegate respondsToSelector:@selector(dockClickindexPathRow:  index: indeXPath:)]) {
        [_dockDelegate dockClickindexPathRow:_dockArray[indexPath.row][@"right"]  index:_path indeXPath:indexPath];
    }
    //取消选中颜色

    BADockCell *cell = (BADockCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.category.textColor=UIColorRGBA(255, 127, 0, 1);
    cell.backgroundColor=UIColorRGBA(246, 246, 246, 1);
    cell.viewShow1.hidden=NO;
    _path=indexPath;
    NSLog(@"选中%zd",_path.row);
}
@end

注意:对于_is变量只是用于第一次默认加载时,判断它并让其对第一个进行选中,最后进行赋值,这样就可以避免在表格绑定列时再进行判断的问题,而_path变量则是为了把选中的值赋给它,在didSelectRowAtIndexPath中一开始对它进行是否为空的判断,这样就可以清理掉上一次的选中;

第二:关于左边选中后右边进行更新,它还有一个效果是右边会刷新从顶部回到第一条,代码简单如下

@property (nonatomic ,strong) BAWineShoppingDockTavleView *dockTavleView;
@property (nonatomic ,strong) BARightTableView *rightTableView;
@property (nonatomic ,strong) NSMutableArray *dockArray;
@property (nonatomic ,strong) NSMutableArray *offsArray;

-(void)viewDidLoad
{
      BAWineShoppingDockTavleView *dockTavleView =[[BAWineShoppingDockTavleView alloc]initWithFrame:(CGRect){0,0,75,kWindowHeight-50}];
    dockTavleView.rowHeight=50;
    dockTavleView.dockDelegate=self;
    dockTavleView.backgroundColor=UIColorRGBA(238, 238, 238, 1);
    [dockTavleView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.view addSubview:dockTavleView];
    _dockTavleView =dockTavleView;

    BARightTableView *rightTableView =[[BARightTableView alloc]initWithFrame:(CGRect){75,0,kWindowWidth-75,kWindowHeight-50}];
    rightTableView.rowHeight=90;
    rightTableView.rightDelegate=self;
    rightTableView.backgroundColor=UIColorRGBA(238, 238, 238, 1);
    [rightTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.view addSubview:rightTableView];
    _rightTableView=rightTableView;
}

-(void)dockClickindexPathRow:(NSMutableArray *)array index:(NSIndexPath *)index indeXPath:(NSIndexPath *)indexPath
{
    [_rightTableView setContentOffset:_rightTableView.contentOffset animated:NO];
    _offsArray[index.row] =NSStringFromCGPoint(_rightTableView.contentOffset);
    _rightTableView.rightArray=array;
    [_rightTableView reloadData];
    CGPoint point=CGPointFromString([_offsArray objectAtIndex:indexPath.row]);
    [_rightTableView setContentOffset:point];
}

第三:关于右边列增加或减少数量时,下面部分变化则是运用的回调的方式实现;在单元列中定义的一个回调,在右边的表格上进行一个委托,然后在主页面上进行实现变化的内容;

右边列.h文件:

#import <UIKit/UIKit.h>

@interface BARightCell : UITableViewCell
@property (nonatomic ,strong) NSMutableDictionary *rightData;
+ (instancetype)cellWithTableView:(UITableView *)tableView;
@property (nonatomic , copy) void (^TapActionBlock)(NSInteger pageIndex ,NSInteger money ,NSString *key);
@end

右边列.m文件(主要代码):

-(void)wineRightClick
{
    int NumberInt =[_wineQuantity.text intValue];
    if (NumberInt ==99) {
        return;
    }
    ++NumberInt;

     _wineQuantity.text =[NSString stringWithFormat:@"%d",NumberInt];
    _rightData[@"Quantity"] = _wineQuantity.text;
    _TapActionBlock([ _rightData[@"Quantity"] integerValue],[_rightData[@"money"] integerValue] ,_rightData[@"ProductID"]);
}

-(void)wineLeftClick
{
    int NumberInt =[_wineQuantity.text intValue];
    if (NumberInt ==0) {
        return;
    }
    --NumberInt;
    _wineQuantity.text =[NSString stringWithFormat:@"%d",NumberInt];
    _rightData[@"Quantity"] = _wineQuantity.text;
    _TapActionBlock([ _rightData[@"Quantity"] integerValue],[_rightData[@"money"] integerValue],_rightData[@"ProductID"]);
    if (NumberInt ==0) {
        return;
    }

}

右边表格的.h:

@protocol RightTableViewDelegate <NSObject>
-(void)quantity:(NSInteger)quantity money:(NSInteger)money key:(NSString *)key;
@end
@interface BARightTableView : UITableView
@property (nonatomic ,strong) NSMutableArray *rightArray;
@property (nonatomic ,weak) id<RightTableViewDelegate>rightDelegate;
@end

右边表格的.m:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    BARightCell *cell =[BARightCell cellWithTableView:tableView];
    cell.TapActionBlock=^(NSInteger pageIndex ,NSInteger money,NSString *key){
        if ([self.rightDelegate respondsToSelector:@selector(quantity:money:key:)]) {
            [self.rightDelegate quantity:pageIndex money:money key:key];
        }
    };
    cell.backgroundColor=UIColorRGBA(246, 246, 246, 1);
    cell.rightData=_rightArray[indexPath.row];
    return cell;
}

主页面实现在变化(rightTableView.rightDelegate=self):

-(void)quantity:(NSInteger)quantity money:(NSInteger)money key:(NSString *)key
{
    NSInteger addend  =quantity *money;

    [_dic setObject:[NSString stringWithFormat:@"%ld",addend] forKey:key];
    //得到词典中所有KEY值
    NSEnumerator * enumeratorKey = [_dic keyEnumerator];
    //遍历所有KEY的值
    NSInteger total=0;
    NSInteger totalSingularInt=0;
    for (NSObject *object in enumeratorKey) {
        total+=[_dic[object] integerValue];
        if ([_dic[object] integerValue] !=0) {
            totalSingularInt +=1;
            _totalSingular.hidden=NO;
        }
    }
    if (totalSingularInt==0) {
        _totalSingular.hidden=YES;
        _bottomLabel.backgroundColor=[UIColor lightGrayColor];
        _bottomLabel.userInteractionEnabled=NO;
        _bottomLabel.text=@"请选购";
    }else
    {
        _bottomLabel.backgroundColor=[UIColor clearColor];
        _bottomLabel.userInteractionEnabled=YES;
        _bottomLabel.text=@"去结算";
    }
    _totalSingular.text=[NSString stringWithFormat:@"%ld",totalSingularInt];
    _totalPrice.text=[NSString stringWithFormat:@"¥%ld",total];

}

第四:关于页面的圆角样式效果

BALabel *bottomLabel =[[BALabel alloc]initWithFrame:(CGRect){kWindowWidth-55-10,50/2-24/2,55,24}];
    bottomLabel.text=@"请选购";
    bottomLabel.textColor=[UIColor whiteColor];
    bottomLabel.textAlignment=NSTextAlignmentCenter;
    bottomLabel.font=Font(13);
    bottomLabel.backgroundColor=[UIColor lightGrayColor];
    bottomLabel.layer.masksToBounds=YES;
    bottomLabel.layer.cornerRadius=6;
    bottomLabel.layer.borderWidth = 1;
    bottomLabel.userInteractionEnabled=NO;
    [bottomLabel addTarget:self action:@selector(bottomLabelClick) forControlEvents:BALabelControlEventTap];
    bottomLabel.layer.borderColor = [[UIColor whiteColor] CGColor];
    [bottomView addSubview:bottomLabel];
时间: 2024-10-09 17:06:55

Purchase购物车实例分析的相关文章

购物车类分析session+single

<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品.打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的. * 解决:将购物车的信息放在数据库,也可以放在session里. * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析

【OpenGL】Shader实例分析(七)- 雪花飘落效果

转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChan

Apache漏洞利用与安全加固实例分析

Apache 作为Web应用的载体,一旦出现安全问题,那么运行在其上的Web应用的安全也无法得到保障,所以,研究Apache的漏洞与安全性非常有意义.本文将结合实例来谈谈针对Apache的漏洞利用和安全加固措施. Apache HTTP Server(以下简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,是最流行的Web服务器软件之一.虽然近年来Nginx和Lighttpd等Web Server的市场份额增长得很快,但Apache仍然是这个领

java基础学习05(面向对象基础01--类实例分析)

面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过setter和getter设置和取得4.如果需要可以加入若干构造方法 5.再根据其它要求添加相应的方法6.类中的所有方法都不要直接输出,而是交给被调用处调用 Demo 定义并测试一个名为Student的类,包括属性有"学号"."姓名"以及3门课程"数学".

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

实例分析Robots.txt写法

题意:经典八数码问题 思路:HASH+BFS #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 500000; const int size = 1000003; typedef int State[9]; char str[30]; int state[9],goal[9]={

Camera图像处理原理及实例分析-重要图像概念

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

HTTP的上传文件实例分析

HTTP的上传文件实例分析 由于论坛不支持Word写文章发帖. 首先就是附件发送怎么搞,这个必须解决.论坛是php的.我用Chrome类浏览器跟踪请求,但是上传的文件流怎么发过去没找到,估计流可能多或者什么的不好显示,只知道发送了文件名字.需要实际了解下post文件,不能只会后台或界面不了解前台数据处理和协议怎么传送数据. 图中:有些相关文章 HTTP请求中的form data和request payload的区别 AJAX POST请求中参数以form data和request payload