Swift——IOS学习杂记(一)

经过20天左右的学习实践,对swift的部分内容有了一定的了解。下面结合自己所做的项目将这些天所学的内容进行总结。本人第一次写博客,可能写的比较乱。

1.Swift~UI详解

对于swift~UI详解,本人主要参考的网址网址为: http://blog.csdn.net/ziyikongfu/article/details/38384307 上面详细介绍了各个UI的使用方法,本人基于原作者的基础上,结合自己的学习,添加了一点点内容。

(1)UILabel

label.textAlignment=NSTextAlignment.Center//文字位置(居中)



(2)UIButton

var btswcxy=UIButton(frame:CGRect(origin:CGPointMake(0.0,0.0),size:CGSizeMake(windowSize.width,44)))
btswcxy.backgroundColor=UIColor(patternImage:UIImage(named:"jump.png")!)//设置背景图片(用原作者的setBackgroundImage更好一些)
btswcxy.setTitle("生物创新园",forState:UIControlState.Normal)
         btswcxy.contentEdgeInsets=UIEdgeInsetsMake(0, -155, 0, 0)//文字的位置,UIEdgeInserts是相对button的frame来计算的(上、左、下、右)
         btswcxy.contentHorizontalAlignment=UIControlContentHorizontalAlignment.Left//文字的位置(居左)


 

(3UITextField

textField.placeholder = "密码”//提示作用
textField.secureTextEntry=true//密码框


 

(4)UISegmentedControl

segControl.selectedSegmentIndex=0//选择哪一个items
segControl.addTarget(self, action:"segmentDidchange:", forControlEvents: UIControlEvents.ValueChanged)
在响应事件segmentDidchange中可以根据segControl.selectedSegmentIndex不同的值对应显示不同的内容。


(5)UITableView

上面所给网址中,原作者所写的UITableView我在应用时出现了各种问题,下面呈现一个简单的UITableView和使用UITableView动态控制表视图中的列表条目。

针对下面代码做以下两点说明:

1.如果想要想要向右滑动时能够delete这一行,则需将下面代码中的注释取消。

2.在func tableView(tableView: UITableView!, didSelectRowAtIndexPathindexPath: NSIndexPath!)函数中可以根据indexPath.row不同有不同的响应事件(即跳转不同的界面,或根据其值请求不同的内容),本代码中这个函数只是将其行数(indexPath.row,从第0行开始)显示出来。


import UIKit
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource
{
   var tableView : UITableView?
   var items :NSMutableArray?
   var leftBtn:UIButton?
   var ctrlsCell=["火影","海贼王","全职猎人","犬夜叉","名侦探","黑执事","吸血鬼","1","1","1","1","1","1","2","2","2","3","4"]
   let windowSize = UIScreen.mainScreen().bounds.size
   
   override func viewDidLoad() {
       super.viewDidLoad()
       self.items = NSMutableArray()
       self.tableView = UITableView(frame:self.view.frame)
       self.tableView!.delegate = self
       self.tableView!.dataSource = self
       self.tableView!.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell")
       self.view.addSubview(self.tableView!)
       for istring in self.ctrlsCell
       {
           var row = self.items!.count
           var indexPath = NSIndexPath(forRow:row,inSection:0)
           self.items?.addObject("1")
           self.tableView?.insertRowsAtIndexPaths([indexPath], withRowAnimation:UITableViewRowAnimation.Left)
       }
       
       
    }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
    }
   
   func tableView(tableView: UITableView, numberOfRowsInSection section:Int) -> Int
    {
       return self.items!.count
    }
   func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell
    {
       let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)as UITableViewCell
       cell.textLabel.text = self.ctrlsCell[indexPath.row]
       //cell.backgroundColor=UIColor(patternImage:UIImage(named:"jump.png")!)
       return cell
    }
   
   func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath:NSIndexPath!) -> Bool
    {
        return true
    }
   
   /*func tableView(tableView: UITableView!, commitEditingStyleeditingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath:NSIndexPath!)
    {
       self.items?.removeObjectAtIndex(indexPath.row)
       
       self.tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation:UITableViewRowAnimation.Top)
       if (self.items!.count == 0)
       {
           self.leftBtn!.userInteractionEnabled = false
       }
       
    }
   */
   func tableView(tableView: UITableView!, editingStyleForRowAtIndexPathindexPath: NSIndexPath!) -> UITableViewCellEditingStyle
    {
       return (UITableViewCellEditingStyle.Delete)
    }
   
  func tableView(tableView: UITableView!, canMoveRowAtIndexPath indexPath:NSIndexPath!) -> Bool
    {
       return true
    }
   
  func tableView(tableView: UITableView!, moveRowAtIndexPathsourceIndexPath: NSIndexPath!, toIndexPath destinationIndexPath: NSIndexPath!)
    {
       self.tableView?.moveRowAtIndexPath(sourceIndexPath, toIndexPath:destinationIndexPath)
       self.items?.exchangeObjectAtIndex(sourceIndexPath.row,withObjectAtIndex: destinationIndexPath.row)
    }
   
   func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath:NSIndexPath!)
    {
       println("row = %d",indexPath.row)
    }
}








import UIKit
 
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource
{
var tableView : UITableView?
var items :NSMutableArray?
var leftBtn:UIButton?
 
override func viewDidLoad() {
   
super.viewDidLoad()
self.title = "I love Swift"
self.items = NSMutableArray()
//self.items?.addObject("1","2")
// Do any additional setup after loadingthe view, typically from a nib.
setupViews()
setupRightBarButtonItem()
setupLeftBarButtonItem()
}
 
func setupViews()
{
self.tableView =UITableView(frame:self.view.frame)
self.tableView!.delegate = self
self.tableView!.dataSource = self
self.tableView!.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell")
self.view.addSubview(self.tableView!)
}
 
func setupLeftBarButtonItem()
{
self.leftBtn =UIButton.buttonWithType(UIButtonType.Custom) as? UIButton
self.leftBtn!.frame = CGRectMake(0,0,50,40)
self.leftBtn?.setTitleColor(UIColor.redColor(),forState: UIControlState.Normal)
self.leftBtn?.setTitle("Edit",forState: UIControlState.Normal)
self.leftBtn!.tag = 100
self.leftBtn!.userInteractionEnabled =false
self.leftBtn?.addTarget(self, action:"leftBarButtonItemClicked", forControlEvents:UIControlEvents.TouchUpInside)
var barButtonItem =UIBarButtonItem(customView: self.leftBtn!)
self.navigationItem.leftBarButtonItem =barButtonItem
}
 
func setupRightBarButtonItem()
{
var barButtonItem = UIBarButtonItem(title:"add", style: UIBarButtonItemStyle.Plain, target: self, action:"rightBarButtonItemClicked")
self.navigationItem.rightBarButtonItem =barButtonItem
}
 
func rightBarButtonItemClicked()
{
 
var row = self.items!.count
var indexPath = NSIndexPath(forRow:row,inSection:0)
self.items?.addObject("1")
self.tableView?.insertRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Left)
self.leftBtn!.userInteractionEnabled = true
}
 
func leftBarButtonItemClicked()
{
if (self.leftBtn!.tag == 100)
{
self.tableView?.setEditing(true, animated:true)
self.leftBtn!.tag = 200
self.leftBtn?.setTitle("Done",forState: UIControlState.Normal)
}
else
{
self.tableView?.setEditing(false, animated:true)
self.leftBtn!.tag = 100
self.leftBtn?.setTitle("Edit",forState: UIControlState.Normal)
}
 
}
 
 
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can berecreated.
}
 
func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int
{
return self.items!.count
}
   
 
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)as UITableViewCell
cell.textLabel.text = String(format:"%i", indexPath.row+1)
return cell
}
 
func tableView(tableView: UITableView!,canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool
{
return true
}
 
func tableView(tableView: UITableView!,commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPathindexPath: NSIndexPath!)
{
self.items?.removeObjectAtIndex(indexPath.row)
 
self.tableView?.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Top)
if (self.items!.count == 0)
{
self.leftBtn!.userInteractionEnabled =false
}
 
}
 
func tableView(tableView: UITableView!,editingStyleForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCellEditingStyle
{
return (UITableViewCellEditingStyle.Delete)
}
 
func tableView(tableView: UITableView!,canMoveRowAtIndexPath indexPath: NSIndexPath!) -> Bool
{
return true
}
 
func tableView(tableView: UITableView!,moveRowAtIndexPath sourceIndexPath: NSIndexPath!, toIndexPathdestinationIndexPath: NSIndexPath!)
{
self.tableView?.moveRowAtIndexPath(sourceIndexPath,toIndexPath: destinationIndexPath)
self.items?.exchangeObjectAtIndex(sourceIndexPath.row,withObjectAtIndex: destinationIndexPath.row)
}
 
func tableView(tableView: UITableView!,didSelectRowAtIndexPath indexPath: NSIndexPath!)
{
println("row = %d",indexPath.row)
}
 
}





2.MD5

swift中使用MD5,其参考的的网址为: http://minishine.sinaapp.com/?p=86,有可能浏览器打不开,下面将其具体过程呈现出来。其中第2步中的 -Bridging-Header.h文件是你在新建NSString+MessageDigest.m时,会提示你是否需要生成。

1、新建两个文件,分别是NSString+MessageDigest.h和NSString+MessageDigest.m

 

NSString+MessageDigest.h  的内容如下:

 

#import <Foundation/Foundation.h>
 
@interface NSString (MessageDigest)
 
- (NSString *)md2;
 
- (NSString *)md4;
 
- (NSString *)md5;
 
- (NSString *)sha1;
 
- (NSString *)sha224;
 
- (NSString *)sha256;
 
- (NSString *)sha384;
 
- (NSString *)sha512;
 
@end
 
 
 
NSString+MessageDigest.m  的内容如下:
 
#import “NSString+MessageDigest.h”
 
#import <CommonCrypto/CommonCrypto.h>
 
typedef unsigned char*(*MessageDigestFuncPtr)(const void *data, CC_LONG len, unsigned char *md);
 
static NSString *_getMessageDigest(NSString*string, MessageDigestFuncPtr fp, NSUInteger length)
 
{
 
const char *cString = [string UTF8String];
 
unsigned char *digest =malloc(sizeof(unsigned char) * length);
 
fp(cString, (CC_LONG)strlen(cString),digest);
 
NSMutableString *hash = [NSMutableStringstringWithCapacity:length * 2];
 
for (int i = 0; i < length; ++i) {
 
[hash appendFormat:@"%02x",digest[i]];
 
}
 
free(digest);
 
return [hash lowercaseString];
 
}
 
@implementation NSString (MessageDigest)
 
- (NSString *)md2
 
{
 
return _getMessageDigest(self, CC_MD2,CC_MD2_DIGEST_LENGTH);
 
}
 
- (NSString *)md4
 
{
 
return _getMessageDigest(self, CC_MD4,CC_MD4_DIGEST_LENGTH);
 
}
 
- (NSString *)md5
 
{
 
return _getMessageDigest(self, CC_MD5,CC_MD5_DIGEST_LENGTH);
 
}
 
- (NSString *)sha1
 
{
 
return _getMessageDigest(self, CC_SHA1,CC_SHA1_DIGEST_LENGTH);
 
}
 
- (NSString *)sha224
 
{
 
return _getMessageDigest(self, CC_SHA224,CC_SHA224_DIGEST_LENGTH);
 
}
 
- (NSString *)sha256
 
{
 
return _getMessageDigest(self, CC_SHA256,CC_SHA256_DIGEST_LENGTH);
 
}
 
- (NSString *)sha384
 
{
 
return _getMessageDigest(self, CC_SHA384,CC_SHA384_DIGEST_LENGTH);
 
}
 
- (NSString *)sha512
 
{
 
return _getMessageDigest(self, CC_SHA256,CC_SHA256_DIGEST_LENGTH);
 
}
 
@end


 

2、在项目名-Bridging-Header.h里面加一句   #import “NSString+MessageDigest.h”

 

3、使用方法如下

 
let aa=”string”
 
let bb= (aa as NSString).md5()



3.Swift封装post和get请求

源码下载地址:http://code.cocoachina.com/detail/214933/swift%E5%B0%81%E8%A3%85%E7%9A%84http+get%E3%80%81post%E8%AF%B7%E6%B1%82/

使用方法地址:http://cc.cocimg.com/bbs/attachment/postcate/topic/16/214933_189_2de514056551362dcd76de5aa0e9b.png

下面是具体的代码,对于原作者下面有一点小改动,原作者的post无法得到对应的数据,问了一下大神后,大神稍微修改了一下,变可以了。修改的部分为  for key:AnyObject in dic.allKeys,原作者写的在代码中我将其注释掉了,虽然我感觉修改后的和原作者写的都一样,不知道原作者的为什么post不到数据。代码如下。

import Foundation 
class HttpClient:NSObject,NSURLConnectionDataDelegate{
   let SYMBOL:NSString?="AaB03x" //分界线的标识符@"AaB03x"
   var connection:NSURLConnection?
   //接受数据的变量
   var receiveData:NSMutableData?
   //上传二进制数据的数据格式如jpg、mp3
   var contentType:String!
   //回调的闭包
   var completeBlock:((data:NSData?,error:NSError?)->Void)?
   
   override init() {
       super.init()
       receiveData=NSMutableData()
    }
   deinit{
       
    }
   func cancel(){
       if (connection != nil){
           connection!.cancel()
       }
    }
   //get 请求
   func downloadFromGetUrl(url:NSString, completionHandler:((data:NSData?,error:NSError?)->Void)){
       let newUrl=NSURL(string: url)//.URLWithString(url)
       let request=NSURLRequest(URL: newUrl!)
       connection=NSURLConnection(request: request, delegate:self)
       self.completeBlock=completionHandler
    }
    //post请求(dic里没有NSData )
   func downloadFromPostUrl(url:NSString,dic:NSDictionary,completionHandler:((data:NSData?,error:NSError?)->Void)){
       
       let newUrl=NSURL(string: url)//.URLWithString(url)
       let request=NSMutableURLRequest(URL:newUrl!)
       request.timeoutInterval=10.0
       request.HTTPMethod="POST"
       var param=NSMutableArray()
       //修改后的
       for key:AnyObject in dic.allKeys{
           let value:NSString = dic[key as NSString] as NSString
           var s=NSString(format:"\(key as NSString)=\(value)")
           param.addObject(s)
       }
       //注释掉的是原作者写的
       /*for key:AnyObject in dic.allKeys{
           var s=NSString(format:"\(key as NSString)=\(dic[key asNSString])")
            param.addObject(s)
       }*/
       var bodyString=param.componentsJoinedByString("&") asNSString
       request.HTTPBody=bodyString.dataUsingEncoding(NSUTF8StringEncoding)
       connection=NSURLConnection(request: request, delegate:self)
        self.completeBlock=completionHandler
    }
   //post 请求(dic里包含NSData)需要设置 contentType的类型
   func downloadNSDataFromPostUrl(url:NSString,dic:NSDictionary,completionHandler:((data:NSData?,error:NSError?)->Void)){
       let newUrl=NSURL(string: url)
       
           ///.URLWithString(url)
       let request=NSMutableURLRequest(URL:newUrl!)
       request.timeoutInterval=10.0
       request.HTTPMethod="POST"
       
       let start=NSString(format:"--\(SYMBOL)")
       let end=NSString(format:"--\(SYMBOL)--")
       var bodyString=NSMutableString()
       var dataKey:NSString?
       for key : AnyObject in dic.allKeys{
           var value : AnyObject!=dic[key as NSString]
           if value.isKindOfClass(NSData){
               dataKey=NSString(format:"\(key)")
           }else{
               bodyString.appendFormat("\(start)\r\n")
                //添加字段名称,换2行
               bodyString.appendFormat("Content-Disposition: form-data;name=\"\(key)\"\r\n\r\n")
                //添加字段的值
               bodyString.appendFormat("\(dic[key as NSString])\r\n")
           }
       }
       //添加分界线,换行
      bodyString.appendFormat("\(start)\r\n")
       
       //声明pic字段,文件名为boris.png
       bodyString.appendFormat("Content-Disposition: form-data;name=\"\(dataKey)\";filename=\"\(dataKey).\(contentType)\"\r\n")
       
       //声明上传文件的格式
       bodyString.appendFormat("Content-Type:\(contentType)\r\n\r\n")
       
       //声明结束符:--AaB03x--
       var endStr=NSString(format:"\r\n\(end)")
       
      //声明myRequestData,用来放入http body
       var myRequestData=NSMutableData()
       //将body字符串转化为UTF8格式的二进制
      myRequestData.appendData(bodyString.dataUsingEncoding(NSUTF8StringEncoding)!)
       //将image的data加入
      myRequestData.appendData(dic[dataKey!] as NSData);
       //加入结束符--AaB03x--
       myRequestData.appendData(endStr.dataUsingEncoding(NSUTF8StringEncoding)!);
       
       //设置HTTPHeader中Content-Type的值
       var  content=NSString(format:"multipart/form-data;boundary=\(SYMBOL)")
       //设置HTTPHeader
       //[request setValue:contentforHTTPHeaderField:@"Content-Type"];
      request.addValue(content, forHTTPHeaderField:"Content-Type")
       //设置Content-Length
        request.addValue(String(myRequestData.length),forHTTPHeaderField:"Content-Length")
 
       request.HTTPBody=myRequestData
       connection=NSURLConnection(request: request, delegate:self)
       self.completeBlock=completionHandler
    }
   //NSURLConnectionDataDelegate
   func connection(connection: NSURLConnection!, didReceiveResponseresponse: NSURLResponse!){
       var newResponse=response as NSHTTPURLResponse
       println("statusCode=\(newResponse.statusCode)")
       
    }
   
    funcconnection(connection: NSURLConnection!, didReceiveData data: NSData!){
       receiveData!.appendData(data)
    }
   
   func connectionDidFinishLoading(connection: NSURLConnection!){
       if (completeBlock != nil){
           completeBlock!(data:receiveData,error:nil)
       }
       
    }
   func connection(connection: NSURLConnection!, didFailWithError error:NSError!){
       if (completeBlock != nil){
           completeBlock!(data:receiveData,error:error)
       }
       
    }
 
}


 

 

get使用以及说明:

如果url为NSURL类型可以通过下面的方法转换为string类型

var str_url1:String =url.absoluteString!//NSURL转化成string

如果url中含有汉字需要Encoding,使用如下方法

var str_url =str_url1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
var dict_map:NSArray
dict_map =dict?.objectForKey("map")?.objectForKey("projecctList") asNSArray//得到所有信息,格式如下图所示,Json数据
var projectName=(dict?.objectForKey("map")?.objectForKey("projecctList")as NSArray)[0].objectForKey("projectName”) as? String


//取NSArray中第一个的projectName,以下图为例,那么所取得数据为“测试数据002”

 

 

post使用:url与上面get相同

dic中包含的键值对,已登陆为例。

其中还包括了将其用户信息存储在本地,首先需要申明var KeepUserMg = NSUserDefaults()。




func presentTabVC(username:NSString,password:NSString) {
       
       let username=username as String//用户名(邮箱)
       let password=password as String//密码
       //println(password)
       var dl=HttpClient()
       var url1:String
       url1="http://61.183.11.242:8081/bioWeb/userapi?oper=login"
       varurl=url1.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
       //post请求需要传递的四个参数loginId(用户名)、userpwd(密码)、type(用户类型)、device(设备),参数是根据别人所给的接口的参数列表来定的。
       vardic=["loginId":username,"userpwd":password,"type":"2","device":"ios"]
       dl.downloadFromPostUrl(url!, dic: dic, completionHandler: {(data:NSData?, error: NSError?) -> Void in
           if (error != nil){
               println("error=\(error!.localizedDescription)")
           }else{
                 vardict=NSJSONSerialization.JSONObjectWithData(data!, options:.MutableContainers,error:nil) as? NSDictionary
                //println(dict)
                varstr=dict?.objectForKey("code") as String//得到返回来的结果
                vardetail=dict?.objectForKey("map")?.objectForKey("ApiUser")as? NSDictionary
               self.usernameInfo=detail?.objectForKey("username") as?String//得到其用户名存储在本地
               self.useremailInfo=detail?.objectForKey("email") as? String//得到其邮箱存储在本地
               
                if str=="success"
                {
                    letError=UIAlertController(title: "提示", message:"登陆成功!", preferredStyle: UIAlertControllerStyle.Alert)
                    letbtAction=UIAlertAction(title: "确定", style:UIAlertActionStyle.Default){ action in
                       self.KeepUserMg.setObject(self.usernameInfo as NSString, forKey:"usernameInfo")
                       self.KeepUserMg.setObject(self.useremailInfo as NSString, forKey:"useremailInfo")
                       self.KeepUserMg.synchronize()
                        self.homepage()
                    }
                    Error.addAction(btAction)
                   self.presentViewController(Error,animated:true,completion:nil)
                   
 
                }
                else if str =="api_login_id_empty"
                {
                    let Error=UIAlertController(title: "提示",message: "用户不存在!", preferredStyle: UIAlertControllerStyle.Alert)
                    letbtAction=UIAlertAction(title: "确定", style:UIAlertActionStyle.Default){ action in
                        self.logInTapped()
                    }
                    Error.addAction(btAction)
                   self.presentViewController(Error,animated:true,completion:nil)
 
                }
               
                else if str =="api_login_pwd"
                {
                    letError=UIAlertController(title: "提示", message:"密码错误!", preferredStyle: UIAlertControllerStyle.Alert)
                    letbtAction=UIAlertAction(title: "确定", style:UIAlertActionStyle.Default){ action in
                        self.logInTapped()
                    }
                    Error.addAction(btAction)
                   self.presentViewController(Error,animated:true,completion:nil)
                }
                else if str =="api_timeout"
                {
                    letError=UIAlertController(title: "提示", message:"登陆超时!", preferredStyle: UIAlertControllerStyle.Alert)
                    letbtAction=UIAlertAction(title: "确定", style:UIAlertActionStyle.Default){ action in
                        self.logInTapped()
                    }
                    Error.addAction(btAction)
                   self.presentViewController(Error,animated:true,completion:nil)
 
                }
                else{
                    let Error=UIAlertController(title:"提示", message: "登陆失败!",preferredStyle: UIAlertControllerStyle.Alert)
                    letbtAction=UIAlertAction(title: "确定", style:UIAlertActionStyle.Default){ action in
                        self.logInTapped()
                    }
                   Error.addAction(btAction)
                   self.presentViewController(Error,animated:true,completion:nil)
 
                }
           }
       })
 
    }




4.其它

页面之间的跳转

(1)直接跳转到其它页面。

 varinfotzgg  = TzggViewController(nibName:nil, bundle: nil)
 self.presentViewController(infotzgg,animated:true,completion:nil)


 (2)跳转到其它页面可以返回。

var infotzgg  = TzggViewController(nibName: nil, bundle:nil)
self.navigationController!.pushViewController(infotzgg,animated: true)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值