Custom Input Views的基本用法

【Codex 深度掌控:从入门到企业级多模型部署】07:插件的力量:利用 Codex++ 插件系统打造个性化开发环境 —— 从理论到实战的完整指南 在Codex++ v2.4插件架构的引领下,AI编程助手正从标准化工具进化为可深度定制的开发平台。本文系统讲述了插件使用的完整路径:先对比三种安装方式,深入剖析Prettier格式化、Prompt模板管理、AI Git提交等社区插件的配置与底层原理;再拆解manifest权限模型、七大生命周期钩子及两种UI注入方案,揭示插件运行机制;最后手把手开发一款“代码解释”插件,覆盖命令注册、消息通信、安全校验等实战环节,并延伸至项目待办提取的进阶玩法。全程提供可运行代码、流程图与踩坑指南,助你从插件用户蜕变为生态构 阅读详情

原文地址:  http://www.raywenderlich.com/1063/ipad-for-iphone-developers-101-custom-input-view-tutorial

 

Custom Input View Tutorial

 

This is the third part of a three part series to help get iPhone Developers up-to-speed with iPad development by focusing on three of the most interesting new classes (at least to me): UISplitView, UIPopoverController, and Custom Input Views.

In the first part of the series, we made an app with a split view that displays a list of monsters on the left side, details on the selected monster on the right side.

In the second part of the series, we added a popover view to allow changing of colors.

In this part, we’re going to add a custom input view (or “keyboard”) to allow selecting your favorite way to kill these monsters.

We’ll start out with where we left off the project last time, so grab a copy if you don’t have it already.

Custom Input View Overview

To display a custom input view, what you need to depends if you’re using a UITextView or UITextField, or something else.

If you’re using a UITextView or UITextField, you’re in luck. All you need to do is assign a custom view to the “inputView” property.

However, if you’re using something else (like we are in this case with our UIImageView), you’ll need to make a custom subclass of the view you’re using so that you can override the inputView getter and return your own custom view.

So we have two classes to write: a custom UIImageView, and our view controller for our custom input view. Let’s start with our custom input view.

Creating a Custom Input View

Go to “File/New File…”, choose “UIViewController subclass”, make sure “Targeted for iPad” and “With XIB for user interface” are checked but “UITableViewController subclass” is NOT checked, and click Next. Name the class “WeaponInputViewController”, and click Finish.

Open up WeaponInputViewController.xib. By default it makes the view the size of the iPad screen, but we want something much smaller in height. Interface Builder won’t let us resize the default view, so delete the default view and add a new one, with width 768 and height 110. Also don’t forget to control-drag from “File’s Owner” to View to reconnect the default view for the owner.

Update:: Jerry Beers from the comments section below pointed out that instead of deleting/re-adding, you can just turn off the simulated UI elements, and then you can resize at will. Thanks Jerry!

Create 5 70×70 buttons along the left side of the view as follows:

Custom Input View Layout

Then set tye type of each Button from “Rounded Rect” to “Custom” and set the image for each button to a weapon, as shown:

Custom Input View Layout With Button Images

Now let’s fill in the class definition. Replace WeaponInputViewController.h with the following:

#import <UIKit/UIKit.h>
#import "Monster.h"
 
@protocol WeaponInputControllerDelegate
- (void)weaponTapped:(Weapon)weapon;
- (void)doneTapped;
@end
 
@interface WeaponInputViewController : UIViewController {
    id<WeaponInputControllerDelegate> _delegate;
}
 
@property (nonatomic, assign) id<WeaponInputControllerDelegate> delegate;
 
- (IBAction)blowgunTapped:(id)sender;
- (IBAction)fireTapped:(id)sender;
- (IBAction)ninjastarTapped:(id)sender;
- (IBAction)smokeTapped:(id)sender;
- (IBAction)swordTapped:(id)sender;
- (IBAction)doneTapped:(id)sender;
 
@end

This should all look familiar – we just set up a protocol so we can notify a listener when a weapon is selected (or the done button), and set up a bunch of action methods.

So let’s hook up those action methods now. Go back to WeaponInputViewController.xib and control-drag from each button to “File’s Owner and hook the button up to the appropriate action method.

Then wrap it up by replacing WeaponInputViewController.m with the following:

#import "WeaponInputViewController.h"
 
@implementation WeaponInputViewController
@synthesize delegate = _delegate;
 
- (BOOL)shouldAutorotateToInterfaceOrientation:
    (UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
 
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
 
- (void)viewDidUnload {
    [super viewDidUnload];
}
 
- (void)dealloc {
    self.delegate = nil;
    [super dealloc];
}
 
- (IBAction)blowgunTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate weaponTapped:Blowgun];
    }
}
 
- (IBAction)fireTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate weaponTapped:Fire];
    }
}
 
- (IBAction)ninjastarTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate weaponTapped:NinjaStar];
    }
}
 
- (IBAction)smokeTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate weaponTapped:Smoke];
    }
}
 
- (IBAction)swordTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate weaponTapped:Sword];
    }
}
 
- (IBAction)doneTapped:(id)sender {
    if (_delegate != nil) {
        [_delegate doneTapped];
    }
}
 
@end

As you can see, nothing too exciting or fancy here. All we do is notify our delegate when the various buttons get tapped. In fact, you could say that this view has no knowledge that it’s even being used as a custom input view controller!

Custom View and Custom Input Controller

We want it to work so that when you tap the image, it brings up the input controller we just made. So like we discussed above, we’ll have to make a subclass of UIImageView so we can return our input view to display.

While we’re at it, we’ll have to make a few oher tweaks to the image view. By default, UIImageViews don’t accept input and don’t become responders to input events, so we’ll have to enable support for that.

So let’s get started. Go to “File/New File…”, choose “Objective-C subclass”, make sure “Subclass of NSObject” is selected, and click Next. Name the class “WeaponSelector”, and click Finish.

#import <Foundation/Foundation.h>
#import "WeaponInputViewController.h"
 
@protocol WeaponSelectorDelegate
- (void)weaponChanged:(Weapon)weapon;
@end
 
@interface WeaponSelector : UIImageView <WeaponInputControllerDelegate> {
    WeaponInputViewController *_weaponInputView;
    Weapon _weapon;
    id<WeaponSelectorDelegate> _delegate;
}
 
@property (nonatomic, retain) WeaponInputViewController *weaponInputView;
@property (nonatomic, assign) Weapon weapon;
@property (nonatomic, assign) IBOutlet id<WeaponSelectorDelegate> delegate;
 
- (UIView *)inputView;
 
@end

Ok let’s explain this a bit. First, we create a delegate so that we can notify a listener when the weapon is changed. Note we could have possibly re-used the WeaponInputControllerDelegate for this, but it isn’t as clean of a design because it muddles the dependencies.

Next, we declare this class as a WeaponInputControllerDelegate since we want to know when the user selects a button in the input view. We store the current selected weapon, and a pointer to the delegate to notify when it changes. Note we mark the delegate as an IBOutlet so we can assign it from Interface Builder later.

Finally, we declare a prototype for the override for the getter for the inputView that this class will contain.

Switch over to WeaponSelector.m and add in the code below. We’re going to split it into sections so we can explain it part by part.

#import "WeaponSelector.h"
 
@implementation WeaponSelector
@synthesize weaponInputView = _weaponInputView;
@synthesize weapon = _weapon;
@synthesize delegate = _delegate;

We start out by adding our synthesize statement like normal.

- (void)setWeapon:(Weapon)weapon {
    _weapon = _weapon;
    switch (weapon) {
        case Blowgun:
            self.image = [UIImage imageNamed:@"blowgun.jpg"];
            break;
        case Fire:
            self.image = [UIImage imageNamed:@"fire.jpg"];
            break;
        case NinjaStar:
            self.image = [UIImage imageNamed:@"ninjastar.jpg"];
            break;
        case Smoke:
            self.image = [UIImage imageNamed:@"smoke.jpg"];
            break;
        case Sword:
            self.image = [UIImage imageNamed:@"sword.jpg"];
            break;
        default:
            break;
    }
}

We then override the weapon property’s setter so that we can set the image appropriately based on the weapon choice.

- (UIView *)inputView {
    if (_weaponInputView == nil) {
        self.weaponInputView = [[[WeaponInputViewController alloc]
            initWithNibName:@"WeaponInputViewController"
            bundle:[NSBundle mainBundle]] autorelease];
        _weaponInputView.delegate = self;
    }
    return _weaponInputView.view;
}

Here’s the most important part – we override inputView to return our own custom view. We just allocate the view controller if we haven’t already, set ourselves as the delegate, and return the view.

- (BOOL)canBecomeFirstResponder {
    return YES;
}
 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self becomeFirstResponder];
}

We override the method to say that yes we CAN become the first responder to input events, and upon a touch we set ourselves as the first responder. This has the effect of bringing up our input view.

- (void)weaponTapped:(Weapon)weapon {
    self.weapon = weapon;
    [self resignFirstResponder];
    [_delegate weaponChanged:weapon];
}
 
- (void)doneTapped {
    [self resignFirstResponder];
}

Here we implement the WeaponInputViewControllerDelegate methods. In the case where a weapon is tapped, we set our weapon to the new weapon (through our property, hence calling our setter override and setting the image as well). We then resign as the first responder, which has the effect of removing our custom input view. Finally we notify our delegate that the weapon has changed so it can take appropriate action.

If done is tapped, we just call resignFirstResponder to remove the input view.

- (void) dealloc
{
    self.weaponInputView = nil;
    [super dealloc];
}
 
@end

At the end we add our cleanup code as usual.

Phew! We’ve done a lot here. Don’t worry we’re almost done – all we have to do now is replace the plain vanilla input view with our custom view, and handle the weaponChanged callback!

Integrating into the Right View

Double click RightViewController.xib, and select the UIImage next to “Preferred way to kill”. Go to the fourth tab in the inspector and change the class from UIImageView to “WeaponSelector”. Also, in the first tab in the inspector check “User Interaction Enabled.”

Inspector Class Settings

Inspector User Interaction Enabled Setting

Finally, control drag from WeaponSelector to “File’s Owner”, and set it as the delegate.

Now make the following changes to RightViewController.h:

// In import section
#import "WeaponSelector.h"
 
// Modify class declaration
@interface RightViewController : UIViewController <MonsterSelectionDelegate,
    UISplitViewControllerDelegate, ColorPickerDelegate, WeaponSelectorDelegate> {
 
// Modify type of weaponView variable
WeaponSelector *_weaponView;
 
// Modify type of weaponView property
@property (nonatomic, retain) IBOutlet WeaponSelector *weaponView;

And make the following changes to RightViewController.m:

// Modify refresh as the following
- (void)refresh {
    _nameLabel.text = _monster.name;
    _iconView.image = [UIImage imageNamed:_monster.iconName];
    _descrLabel.text = _monster.descr;
    _weaponView.weapon = _monster.preferredWayToKill;
}
 
// Add the following new method
- (void)weaponChanged:(Weapon)weapon {
    if (_popover != nil) {
        [_popover dismissPopoverAnimated:YES];
    }
    _monster.preferredWayToKill = weapon;
}

Compile and run, and if all works well, you shoudl be able to tap the icon to bring up a custom image view!

Custom Input View Screenshot

Show Me the Code!

Here’s a copy of all of the code we’ve developed so far.

That’s all for the iPad for iPhone Developers 101 series for now. However soon I will write an article about how to port iPhone apps to the iPad!

customInputs HTML,CSS,JS:简单的自定义输入库。 立即下载

相关推荐

Custom Input Form.zip

uipath studio custom input 自定义布局加载html,返回html页面输入的信息,

Bootstrap4 自定义表单

Bootstrap4 可以自定义一些表单的样式来替换浏览器默认的样式。 自定义复选框 如果要自定义一个复选框,可以设置 为父元素,类为 .custom-control 和 .custom-checkbox,复选框作为子元素放在该 里头,然后复选框设置为 type=“checkbox”,类为 .custom-control-input。 复选框的文本使用 label 标签,标签使用 .custom-control-label 类,label 的 for 属性值需要匹配复选框的 id。 <!DOC

weixin_45116096的博客 555

jQuery-Custom-Input:可访问的、定制设计的复选框和单选按钮输入,使用 CSS(和一些 jQuery)设计

一书中的代码示例 该存储库包括由 Filament Group, Inc. 开发和维护的开源代码,作为“渐进式增强设计”(Peachpit) 一书的一部分。 购买本书的人可以通过以下 URL 访问本书中的所有示例: : 。 所有示例都使用。 这些代码示例使用来应用基于浏览器功能测试的渐进增强。

uipath input方法多种操作方式以及成功率

uipath input 方式

u010805109的博客 595

customInputs:输入元素的自定义样式

浏览器的常规复选框和收音机通常很难看,或者可能不适合您的设计。 在本教程中,我将向您展示如何使用 CSS 和用于复选标记的为收音机和复选框应用您自己的样式。 随意根据您的需要更改样式(取决于您的图标字体和您必须执行的默认字体)。 另外我解释了如何创建一个开/关开关。 我使用 CSS3,但我提供了一个回退来呈现旧浏览器的默认复选框和收音机 (IE8)。 为了更好的代码结构,我在本教程中使用了 ,但您可以在最后找到编译后的 CSS。 ### 截屏: ##Checkboxes 和 radios 我为我的代码使用前缀,所以我不必担心覆盖第三方代码。 我在这个例子中使用fh- ,但当然你可以使用你自己的。 由于复选框和收音机的样式几乎相同,我将它们放在一起以避免代码重复。 为了更好的可读性,我只显示属于当前步骤的代码,并将其余代码替换为// ... 。 你可以在最后找到完整的代码。 让我们开始

OpenV2X 车路协同开源平台 Columbia 版本正式发布!

OpenV2X车路协同开源平台Columbia 版本正式发布!

weixin_65571684的博客 1198

Vue Antdv a-form 表单中使用自定义组件,并支持 v-decorator 效验

一、简介 Vue 自定义组件实现 v-model 数据双向绑定 在使用 Antdv 中 Form 表单的时候,有时候需要官方自带的组件未必够用。 这个时候需要使用到自定义的一些组件,自定义的组件需要支持数据双向绑定,也需要支持 v-decorator 的数据效验,或者默认值设置等等。 二、自定义相关组件 CustomInput.vue:自定义一个输入框来举例 <template> <!-- 包装一个 input,让它支持数据双向绑定 v-model,同时也支持 fo

卡尔特斯 4718

仿真每日一练 | Workbench如何在网格节点施加载荷

打开Workbench 2020 R2,在分析系统中双击静力分析工程项目,双击Geometry打开Design Modeler,在菜单栏的单位(Units)修改为毫米(Millimeter),在XY平面创建草图,在草图内绘制矩形并标注尺寸,拉伸长方体,如图1所示。:单个零部件,无连接关系,但需定义一个节点组件,如图5所示,选择Create Named Selection。对添加的节点组件施加Y方向50N的力,如图8所示。1-1-3.有限元系统模型构建。1-1-1.几何模型构建。1-1-2.材料定义。

ansysxuexizhe的博客 1236

uview自定义导航栏(自定义返回路径)

依赖包:uview框架配置 1.pages.json页面关闭原生的导航栏 { // 待办事项 "path" : "pages/home/backlog/backlog/backlog", "style" : { "navigationS

maoxiaohei_的博客 1万+

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9112

小程序 自定义组件( 二)

  behaviors 定义和使用 behaviors behaviors 是用于组件间代码共享的特性,类似于一些编程语言中的“mixins”或“traits”。 每个 behavior 可以包含一组属性、数据、生命周期函数和方法,组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。每个组件可以引用多个 behavior 。 behavior 也可以引用其...

bihansheng2010的博客 3504

【RT-DETR创新改进】改进前必看!对Ultralytics调参, 1:1还原RT-DETR官方版本实验参数,使用原汁原味的RT-DETR模型,才能高效跑实验、高效涨点、收割小论文、完成大论文!!!

本文针对Ultralytics训练RT-DETR精度不佳问题,提供参数配置优化方案。通过对比官方RT-DETR参数设置,详细指导如何修改Ultralytics版本的关键参数,包括优化器、学习率、权重衰减等6处配置调整。操作步骤涵盖default.yaml文件修改和trainer.py代码调整,确保模型收敛性能达到官方水平,帮助研究者快速提升实验效果。文末附官方源码链接和具体参数配置网址供参考。

Ai缝合怪、助力小伙伴高效发论文 1780

ios Input Views and Input Accessory Views

文档说明: Custom Views for Data Input UIKit allows applications to substitute custom input views for the system keyboard. It also enables applications to have an accessory view above the system keyboard

冷胜任 的专栏 3773

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 595

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6863

Custom Input View Tutorial

This is the third part of a three part series to help get iPhone Developers up-to-speed with iPad development by focusing on three of the most interesting new classes (at least to me): UISplitView

968

对halcon形状匹配算法的一点分析

基于Intel VTune Profiler对halcon形状匹配算法的一点分析

manuoo的专栏 567

ME5xN(x:1-2): custom column is editable in Subscreen Item but not in ALV grid

FM MEMFS_BUILD_MAPPING_PO_VIEWS->LMEMFSF0Z enhancement 14 zenhance_alvg_rid_editable. "active version map 'ZZ_NOT_INPUT' mmmfd_cust_01. endenhancement. BADI IF_EX_ME_PROCESS_REQ_CUST~FIE...

282

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Trix富文本编辑器:现代Web富文本编辑的架构革命

在Web开发领域,富文本编辑器长期面临着浏览器兼容性、内容一致性、性能优化等核心挑战。传统基于`contenteditable`和`execCommand`的编辑器方案,虽然提供了即时的所见即所得体验,却因浏览器实现差异导致跨平台体验碎片化,内容格式难以预测,严重制约了企业级应用的开发效率。Trix编辑器通过创新的架构设计,重新定义了富文本编辑的实现范式,为开发者提供了稳定、可预测的现代编辑解决方

gitblog_00396的博客 644

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

认识下载elementUI,mintUI.认识mint组件学习。报错处理

实现ElementUI的经典布局 新建views/Components.vue ,搭建页面布局结构。 配置路由: 访问/components,看到页面内容。 Vue的嵌套路由 根据当前需求: 当访问: /components/border 组件页面的main部分显示border 当访问: /components/icon 组件页面的main部分显示icon 当访问: /components/color 组件页面的main部分显示color 发现需要在compoents页面中还有需要动态更

1461590508@qq.com的博客 336

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Salesforce Apex开发笔记

Apex开发笔记

trjays的博客 3852

Gemini 3.1 Pro实战指南:构建可接管工作流的数字同事

大型语言模型正从‘问答式AI’迈向‘任务型智能体’,其核心在于百万级上下文理解、可控工具调用与多步自主规划能力。这类智能体不再依赖碎片化提示,而是通过内部知识图谱建模业务逻辑,结合Custom Tools实现安全、可审计的系统交互,并以Agent模式闭环执行端到端任务。技术价值体现在降低人工干预、提升流程鲁棒性与加速知识沉淀;典型应用场景包括遗留系统文档分析、自动化合规审计、GitHub安全评估等工程实践。本文聚焦Gemini 3.1 Pro在Vertex AI平台上的落地路径,覆盖环境配置、Tool Sc

conghuang7343的博客 492

TensorFlow Data Input (Part 2): Extensions & Hacks

From: https://indico.io/blog/tensorflow-data-input-part2-extensions/ In Part 1 of this mini series, we explored various methods of data input for machine learning models using TensorFlow. In this

slamer的专栏 1178

转载自flutter微信社区 flutter官方帮助android工程师了解flutter

这篇文档旨在帮助 Android 开发者通过 Flutter 开发移动应用。如果你了解 Android 框架的基本知识,你就可以使用这篇文档作为 Flutter 开发的快速入门。 你的 Android 知识和技能对于 Flutter 开发是非常有用的,因为 Flutter 依赖于 Android 操作系统的多种功能和配置。Flutter 是一种全新的构建移动界面的方式,但是它有一套和 Android(以及 iOS)进行非 UI 任务通信的插件系统。如果你是一名 Android 专家,你就不必重新学习所有知识

weixin_43590176的博客 441

5 分钟配好 Zotero GPT 插件:摘要、翻译与 PDF 问答上手指南

zotero-gpt 是一个 Zotero 插件,把 GPT 直接装进 Zotero 的文献列表和 PDF 阅读器:选中 PDF 段落可以翻译成中文,向整篇 PDF 提问,让 GPT 基于摘要给条目推荐标签,还能自己写命令标签,把常用流程一键化。插件通过 OpenAI 接口工作,配好 API 密钥后,在主窗口按 Shift + / 唤起面板就能开始用。 ## 项目速览 - 向整篇 PDF 提问

gitblog_00896的博客 645
上一篇: 调整视图控制器xib文件中标准视图的尺寸
下一篇: Mac OS X下的截屏功能和使用技巧
StudyRecord
博客等级 码龄16年 96粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值