iOS开发-QQ好友列表展示

VC 仿QQ聊天对话框与好友列表框 VC 仿QQ聊天对话框与好友列表框(来自新兴网络) 立即下载

那么今天给同学写了一个QQ好友列表展示的Demo,涉及很多的内部细节以及高度封装自定义的cell和自定义view,那么内部所用知识和细节全部呈现在代码和注释中,那么废话不多说直接上代码,先看效果图!

 

 

//

//  ZZFriendGroup.h

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface ZZFriendGroup : NSObject

/**

 *  组的姓名

 */

@property (nonatomic, copy) NSString *name;

/**

 *  好友数

 */

@property (nonatomic, strong) NSArray *friends;

/**

 *  在线数

 */

@property (nonatomic, assign) NSInteger online;

/**

 *  是否展开 这里提供一个getter方法出来 外部访问 如 model.isOpened 就很显而已懂 写和不写 一看就有大神的区别

 */

@property (nonatomic, assign, getter = isOpened) BOOL opened;

 

- (instancetype)initWithDict:(NSDictionary *)dict;

 

+ (instancetype)groupWithDict:(NSDictionary *)dict;

 

@end

 

//

//  ZZFriendGroup.m

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import "ZZFriendGroup.h"

#import "ZZFriends.h"

 

@implementation ZZFriendGroup

- (instancetype)initWithDict:(NSDictionary *)dict

{

    if (self = [super init]) {

        // 1.通过kvc注入所有的属性

        [self setValuesForKeysWithDictionary:dict];

        

        // 2.不一样的属性特殊处理

        NSMutableArray *friendArr = [NSMutableArray array];

        for (NSDictionary *dict in self.friends) {

            ZZFriends *friend = [ZZFriends friendWithDict:dict];

            [friendArr addObject:friend];

        }

        self.friends = friendArr;

    }

    

    return self;

}

 

+ (instancetype)groupWithDict:(NSDictionary *)dict

{

    return [[self alloc] initWithDict:dict];

}

 

@end

 

//

//  ZZFriends.h

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface ZZFriends : NSObject

/**

 *  图标

 */

@property (nonatomic, copy) NSString *icon;

/**

 *  简介

 */

@property (nonatomic, copy) NSString *intro;

/**

 *  名字

 */

@property (nonatomic, copy) NSString *name;

/**

 *  vip : 提供getter方法 外部访问 例如 self.isVip 都能准确明白是不是会员 这样写一看就是大神

 */

@property (nonatomic, assign, getter = isVip) BOOL vip;

 

- (instancetype)initWithDict:(NSDictionary *)dict;

+ (instancetype)friendWithDict:(NSDictionary *)dict;

@end

 

//

//  ZZFriends.m

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import "ZZFriends.h"

 

@implementation ZZFriends

- (instancetype)initWithDict:(NSDictionary *)dict

{

    if (self = [super init]) {

        [self setValuesForKeysWithDictionary:dict];

    }

    return self;

}

 

+ (instancetype)friendWithDict:(NSDictionary *)dict

{

    return [[self alloc] initWithDict:dict];

}

 

@end

 

//

//  ZZFriendCell.h

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

@class ZZFriends;

@interface ZZFriendCell : UITableViewCell

 

 

+ (instancetype)cellWithTableView:(UITableView *)tableView;

 

#pragma mark - 这里写出friend 作为成员属性的变量名 会发现是系统的关键词 因为Xcode 支持 OC C C++ friend 为C++中的友元函数\友元类

@property (nonatomic, strong) ZZFriends *friendData;

 

@end

 

//

//  ZZFriendCell.m

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import "ZZFriendCell.h"

#import "ZZFriends.h"

 

@implementation ZZFriendCell

+ (instancetype)cellWithTableView:(UITableView *)tableView

{

    static NSString *ID = @"friend";

    

    ZZFriendCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    

    if (cell == nil) {

        cell = [[ZZFriendCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

    }

    

    return cell;

}

 

- (void)setFriendData:(ZZFriends *)friendData

{

    _friendData = friendData;

    

#warning - 原来这里傻逼了 属性值不对所以直接蹦了

    self.imageView.image = [UIImage imageNamed:friendData.icon];

    

    self.textLabel.text = friendData.name;

    

    self.detailTextLabel.text = friendData.intro;

    

    if (friendData.isVip) {

        self.detailTextLabel.textColor = [UIColor redColor];

    } else {

        self.detailTextLabel.textColor = [UIColor blackColor];

    }

}

@end

 

 

//

//  ZZHeaderView.h

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

 

@class ZZFriendGroup,ZZHeaderView;

 

@protocol ZZHeaderViewDelegate <NSObject>

@optional

- (void)headerViewDidClick:(ZZHeaderView *)headerView withSection:(NSInteger)section;

 

@end

 

#warning - 这里如果你有疑问你觉得为什么都长的一样不用xib来描述 UITableViewHeaderFooterView 这个东西是比较高级的所以目前无法用xib来描述

 

@interface ZZHeaderView : UITableViewHeaderFooterView

 

+ (instancetype)headerViewWithTableView:(UITableView *)tableView;

 

@property (nonatomic, strong) ZZFriendGroup *group;

 

@property (nonatomic, assign) NSInteger section;

 

@property (nonatomic, weak) id <ZZHeaderViewDelegate> delegate;

 

@end

 

//

//  ZZHeaderView.m

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import "ZZHeaderView.h"

#import "ZZFriendGroup.h"

 

@interface ZZHeaderView()

@property (nonatomic, weak) UIButton *nameView;

@property (nonatomic, weak) UILabel *countView;

@end

 

@implementation ZZHeaderView

 

+ (instancetype)headerViewWithTableView:(UITableView *)tableView

{

    static NSString *ID = @"group";

    

#warning - 当你熟悉了cell的重用那么到这里你很容易推导出来头部和尾部的重用机制

//    ZZHeaderView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:ID];

    

#warning - (目前这里在刷新头部的view的时候有问题所以暂时还在思考如何优化)

    ZZHeaderView *header = [[ZZHeaderView alloc] initWithReuseIdentifier:ID];

    

//    if (header == nil) {

//        header = [[ZZHeaderView alloc] initWithReuseIdentifier:ID];

//    }

    return header;

}

 

- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier

{

    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {

        // 1.一个按钮来承载下标和该组的标题

        UIButton *nameView = [[UIButton alloc] init];

        [nameView setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg"] forState:UIControlStateNormal];

        [nameView setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg_highlighted"] forState:UIControlStateHighlighted];

        [nameView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

        [nameView addTarget:self action:@selector(nameViewClick) forControlEvents:UIControlEventTouchUpInside];

        nameView.titleLabel.font = [UIFont systemFontOfSize:15.0f];

        // 这里是更改水平方向 内部属性如何布局

        nameView.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

        

        // 设置整个按钮的内边距

        nameView.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);

        

        // 设置图片或者文字的内边距

        nameView.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

        

        // 设置图片旋转始终居中

        nameView.imageView.contentMode = UIViewContentModeCenter;

        

        // imageView 默认会剪切

        nameView.imageView.clipsToBounds = NO;

        

#pragma mark - 那么这里添加到夫类中我们就要考虑和cell一样 有没有contentView属性

        [self.contentView addSubview:nameView];

        self.nameView = nameView;

        

        // 2.一个label来承载在线人数

        UILabel *countView = [[UILabel alloc] init];

        countView.textColor = [UIColor grayColor];

        countView.font = [UIFont systemFontOfSize:14.5f];

        countView.textAlignment = NSTextAlignmentRight;

        [self.contentView addSubview:countView];

        self.countView = countView;

    }

    

    return self;

}

 

#warning - 这里我们才能确定子控件的frame 所以只能在这里进行布局 一看这个方法名就这么有水准

- (void)layoutSubviews

{

    [super layoutSubviews];

    

    self.nameView.frame = self.bounds;

    

    CGFloat countViewW = 100;

    CGFloat countViewX = self.frame.size.width - countViewW - 15;

    CGFloat countViewY = 0;

    CGFloat countViewH = self.frame.size.height;

    self.countView.frame = CGRectMake(countViewX, countViewY, countViewW, countViewH);

}

 

- (void)setGroup:(ZZFriendGroup *)group

{

    _group = group;

    

#warning - 那么这里我们可以看到按钮的设置 其属性全部默认是居中的那么我们就应该做出相应的调整

    // 设置标题和图标

    [self.nameView setTitle:group.name forState:UIControlStateNormal];

    [self.nameView setImage:[UIImage imageNamed:@"buddy_header_arrow"] forState:UIControlStateNormal];

    

    // 设置在线人数

    self.countView.text = [NSString stringWithFormat:@"%ld/%ld",group.online,group.friends.count];

}

 

- (void)setSection:(NSInteger)section

{

    _section = section;

    

    self.nameView.tag = section;

}

 

/**

 *  点击该行

 */

- (void)nameViewClick

{

    // 0.设置展开或者隐藏

    self.group.opened = !self.group.opened;

    

    // 1.通知代理刷新表格

    if ([self.delegate respondsToSelector:@selector(headerViewDidClick:withSection:)]) {

        [self.delegate headerViewDidClick:self withSection:self.nameView.tag];

    }

    

#warning - 我们可以拿到按钮内部所有的东西 如果要旋转 我们应该用到transform如果不能直接旋转那么分析首先可能是autoLayout 限制了!如果不能执行这些操作那么也要分析 尤其在tableView 中只要刷新表格那么他就不会管缓存池 去重新创建的!内存地址不一样!

    // 2.那么要执行旋转很多人会考虑在这里处理 那么这也是个难点(点了没反应这是因为旧的你旋转了但是他直接创建了一个新的移除了旧的所以这里肯定不行)

//    if (self.group.isOpened) {

//        self.nameView.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

//    } else {

//        self.nameView.imageView.transform = CGAffineTransformMakeRotation(0);

//    }

}

 

/**

 *  当一个控件被添加到父控件中的时候就会被调用

 */

- (void)didMoveToSuperview

{

    if (self.group.isOpened) {

        self.nameView.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

    } else {

        self.nameView.imageView.transform = CGAffineTransformMakeRotation(0);

    }

}

 

//- (void)willMoveToSuperview:(UIView *)newSuperview

//{

//    

//    

//    if (self.group.isOpened) {

//        self.nameView.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);

//    } else {

//        self.nameView.imageView.transform = CGAffineTransformMakeRotation(0);

//    }

//}

 

 

@end

 

//

//  ZZFriendTableViewController.h

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

@interface ZZFriendTableViewController : UITableViewController

 

@end

 

 

//

//  ZZFriendTableViewController.m

//  12-QQ好友列表展示

//

//  Created by 周昭 on 16/12/12.

//  Copyright © 2016年 HT_Technology. All rights reserved.

//

 

#import "ZZFriendTableViewController.h"

#import "ZZFriendGroup.h"

#import "ZZFriends.h"

#import "ZZFriendCell.h"

#import "ZZHeaderView.h"

 

@interface ZZFriendTableViewController()<ZZHeaderViewDelegate>

 

@property (nonatomic, strong) NSArray *groups;

 

@end

 

@implementation ZZFriendTableViewController

 

#pragma mark - 那么这里写给同学们讲一下为什么有时候用 NSArray 有时候用 NSMutableArray 当你的数据固定的时候你已经写好了不希望你的同事随便的改那肯定是用 NSArray 那么他就不能调用[groups addobject:]方法

- (NSArray *)groups

{

    if (_groups == nil) {

        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"friends.plist" ofType:nil]];

        

        NSMutableArray *groupArray = [NSMutableArray array];

        for (NSDictionary *dict in dictArray) {

            ZZFriendGroup *group = [ZZFriendGroup groupWithDict:dict];

            [groupArray addObject:group];

        }

        

        _groups = groupArray;

    }

    return _groups;

}

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    // 1.设置每个cell的高度

    self.tableView.rowHeight = 50;

    

    // 2.设置头部view的高度

    self.tableView.sectionHeaderHeight = 50;

}

 

/**

 *  隐藏状态栏

 */

- (BOOL)prefersStatusBarHidden

{

    return YES;

}

 

#pragma mark - tableView 数据源和代理方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

    return self.groups.count;

}

 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

#warning - 那么我们如何实现 展开和显示呢?这里 就直接来实现一下 (当这一组没有数据的时候那么就合并了 所有我就直接说我的方案 点击按钮的时候来根据点击按钮的状态来判断开或者关)

 

    ZZFriendGroup *group = self.groups[section];

    return group.isOpened ? group.friends.count : 0;

}

 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

#pragma mark - 那么我们这里进行需求驱动开发

    // 1.创建一个属于自己的cell

    ZZFriendCell *cell = [ZZFriendCell cellWithTableView:tableView];

    

    // 2.给cell传递模型

    ZZFriendGroup *group = self.groups[indexPath.section];

    cell.friendData = group.friends[indexPath.row];

    

    // 3.返回cell

    return cell;

}

 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{

    // 1.那么这里就要自定义头部的view

    ZZHeaderView *header = [ZZHeaderView headerViewWithTableView:tableView];

    header.delegate = self;

    

    // 2.给自定义view传递模型

    ZZFriendGroup *group = self.groups[section];

    header.group = group;

    header.section = section;

    

    NSLog(@"%p ------ %ld",header, section);

    

    // 3.赋值

    return header;

}

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

 

#pragma mark - ZZHeaderViewDelegate方法

- (void)headerViewDidClick:(ZZHeaderView *)headerView withSection:(NSInteger)section

{

    [self.tableView reloadData];

}

@end

 

 

 

VC++ 高仿QQ好友列表窗体界面 VC++ 高仿QQ好友列表窗体界面,做界面必参考,源码 立即下载

相关推荐

MFC 树形控件 实现qq好友列表功能

实现树形控件,自绘小三角 ,加载图片,选中变色

OCiOS开发:表格视图实现腾讯好友列表展开收缩效果

前言这几天刚刚给学生讲到了表格视图的使用,有学生问我,如果要实现类似于腾讯好友列表展开收缩的效果该怎么实现呢?以前我写过有关这样效果的demo,但是一直没有发表成文,今天刚好有时间,于是写出来,分享给各位,当然要实现这种效果方法还是有很多,这里就讲解下我的实现方式,不到之处,还往各位提点建议,我会及时改进。效果为了简化数据,所以每个分组里面的好友数据都是一样的。实现思路1、用一个字典来判断,将sec

李鴻耀 6253

自定义列表控件仿QQ2010以后好友列表

主要功能: 1、重新自定义列表,实现列表标题栏和用户列表高度不一样自绘 2、满足原先要求的标题能展开和收起的情况下,给标题增加了用户列表的孩子节点个数显示 3、满足第二级菜单一张图和一串文字的情况下,增加另外一行最近消息的显示,第一行显示用户昵称 4、实现选中高亮紫色显示; 5、实现单选列表主题展开和收起 6、实现选中用户列表提示用户昵称信息 主要解决问题和bug: 1、自定义列表时Assert断言窗口失败; 2、自定义列表时主题和用户列表怎么分开显示; 3、自定义列表数据如何绑定,这个想了好久,也做了好多次实验,决定用映射数据的方式实现; 即addstring时只添加用户和列表的id,重绘时在列表数据结构中找到对应id信息; 4、解决用户展开和收起时图片错乱bug,建立图片列表和列别单项数据映射结构; 5、解决标题栏展开和收起用户列表显示错误bug; 6、解决标题栏和用户列表高度不一致的问题;

ios中自定义列表的展示

ios自定义列表的一种方式

木兰缀露博客 525

仿qq好友列表

模仿qq好友列表布局,可收缩、展开 欢迎大家下载和学习!!!

在MFC下利用ListCtrl做一个类似QQ好友的列表

在MFC下利用ListCtrl做一个类似QQ好友的列表,是通过背景贴图实现的。自己做这上面做修改也比较方便。不过要在父控件上得到双击事件,还是需要自己利用消息传递方法传给父控件。

IOS实现仿qq好友列表功能

ios开发之实现仿qq好友列表功能 // // UserTableViewCell.h // UITableView协议 // // Created by mouweng on 17/8/26. // Copyright © 2017年 mouweng. All rights reserved. // #import @interface UserTableViewCell

专业划水20年 988

c++源代码 一款类似QQ聊天的IM聊天软件 功能强大 值得学习

c++源代码 一款类似QQ聊天的IM聊天软件 功能强大 值得学习 使用了多项技术 其中还涉及数据库

iOS开发---当tableview滚到视图底部展开列表后看不到数据

实现类型qq列表的效果 在自定义section表头的点击事件中操作 CGPoint point = [gesture locationInView:self.view]; //返回触摸点在视图中的当前坐标 CGRect rect=CGRectMake(80, kScreenHeight-64-80, kScreenWidth-90, 60); // RMLog(@"r

Raymon、浅忆。 1172

YonSuite如何新增用户并分配角色角色授权图文教程

用友YonSuite产品基础教学

ct341688的博客 617

关于AD中如何绘制原理图及其封装

AD中如何绘制原理图及其封装 题记:这是一个比较基础的知识,之所以我打算写一篇这样的笔记,主要是因为在日常生活中,我极少绘制特殊模块或芯片原理图及其封装。久而久之就忘记咋画了,有时需要画封装的时候又想不起来,网上的资料虽然一堆堆的,但往往只是仅原理图的绘制,或者是仅封装的绘制。为此我写一篇这样的笔记,记录绘制原理图及其封装的一条龙服务,感觉这对我而言尤为重要。 本文分为三大板块,依次是原理图的绘制、封装的绘制、二者的联立 第一板块——原理图的绘制 原理图的建立 第二板块——封装的绘制 第三板块——二者的

weixin_51130221的博客 7万+

iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二)

iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二) 一、实现效果             二、实现代码 1.数据模型部分  YYQQGroupModel.h文件 1 // 2 // YYQQGroupModel.h 3 // 02-QQ好友列表(基本数据的加载) 4 // 5 // Created by apple

coder 637

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1342

CoppeliaSim+matlab+simulink七轴机械臂仿真

七轴机械臂vrep+matlab+simulink 仿真

a1233219的博客 3545

Cadence OrCAD Capture 保持元器件编号情况复制元件,复制后元器件编号与复制前不同的问题解决

如下图所示复制时,已经勾选了“Preserve reference on copy”但是复制后的编号却与复制前不一样。本文简单介绍其原因及解决方法。

fydar的博客 3163

iOS开发UI篇章使用UItableview完成一个简单的QQ好友列表(一)

iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一、项目结构和plist文件 TXViewController.m 二、实现代码 1.说明: 主控制器直接继承UITableViewController   // //  TXViewController.h //  04-QQ好友列表 // //  Created by 鑫

软件工程班梁镋鑫的专栏 903

11、ThingsBoard集群部署k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 990

iOS开发UI基础—27使用UItableview完成一个简单的QQ好友列表(一)

iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一、项目结构和plist文件   二、实现代码 1.说明: 主控制器直接继承UITableViewController // YYViewController.h // 02-QQ好友列表(基本数据的加载) // // Created by apple on 14-5-31. //

沐阳的博客 838

基于Stateflow的驱动电机控制系统模式管理与安全策略研究

摘要 本文基于Stateflow状态机建模工具,研究了驱动电机控制系统的模式管理架构与安全策略实现方法。通过分析电机控制系统的工作模式,设计了包含初始化、待机、校准、对齐、运行、故障、复位七种状态的有限状态机模型,并建立了三级故障处理机制和降额保护策略。基于Simulink/Stateflow搭建的仿真模型实现了模式切换逻辑和安全管理功能,验证了系统能够正确响应各类控制事件,故障处理机制可有效保护系统安全。研究成果为电动汽车电机控制系统的工程开发提供了参考。 关键词:Stateflow;驱动电机控制;模式管

AI的内部世界的博客 58

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3402
上一篇: iOS开发-静态单元格展示
下一篇: iOS开发-自定义HUD(非常轻量级)
ZZ_iOSDeveloper
博客等级 码龄11年 21粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值