一、简述
在iOS开发过程中,页面跳转时在页面之间进行数据传递是很常见的事情,我们称这个过程为页面传值。页面跳转过程中,从主页面跳转到子页面的数据传递称之为正向传值;反之,从子页面返回主页面时的数据传递称之为反向传值。
目前我所了解和掌握的传值方式有:
- 属性传值
- 单例传值
- NSUserDefaults传值
- 代理传值
- block传值
- 通知传值
- KVO/KVC iOS----KVC和KVO 详解
二、页面传值的详解
2.0 准备工作
为了实现页面之间传值,我们需要准备两个页面,代码结构如下图所示。其中,KLMainViewController为主主页面,KLSubViewController为子页面,页面之间的跳转使用UINavigationController来实现。每个页面中都有一个文本编辑框,我们需要将其中一个页面文本框中的内容传递到另一个页面中。
#import "KLMainViewController.h"
#import "KLSubViewController.h" @interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; _textField = [[UITextField alloc] init];
_textField.textColor = [UIColor redColor];
_textField.textAlignment = NSTextAlignmentCenter;
_textField.backgroundColor = kBgColor;
_textField.text = @"主界面的label信息";
[self.view addSubview:_textField];
WEAKSELF
[_textField mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(weakSelf.view).mas_offset(0.0f);
make.left.mas_equalTo(weakSelf.view).mas_offset(15.0f);
make.right.mas_equalTo(weakSelf.view).mas_offset(-15.0f);
}]; _button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setTitle:@"跳转到子界面" forState:UIControlStateNormal];
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_button];
[_button mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(weakSelf.view).mas_offset(0.0f);
make.top.mas_equalTo(weakSelf.textField.mas_bottom).mas_offset(40.0f);
}]; } - (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
[self.navigationController pushViewController:subVC animated:YES];
} @end
KLMainViewController.m
//KLSubViewController.h
#import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface KLSubViewController : UIViewController @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @property (strong, nonatomic) NSString *content; @end NS_ASSUME_NONNULL_END //KLSubViewController.m
#import "KLSubViewController.h" @interface KLSubViewController () @end @implementation KLSubViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"子界面"; _textField = [[UITextField alloc] init];
_textField.textColor = [UIColor redColor];
_textField.textAlignment = NSTextAlignmentCenter;
_textField.backgroundColor = kBgColor;
_textField.text = @"子界面的label信息";
[self.view addSubview:_textField];
WEAKSELF
[_textField mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(weakSelf.view).mas_offset(0.0f);
make.left.mas_equalTo(weakSelf.view).mas_offset(15.0f);
make.right.mas_equalTo(weakSelf.view).mas_offset(-15.0f);
}]; _button = [UIButton buttonWithType:UIButtonTypeCustom];
[_button setTitle:@"返回主界面" forState:UIControlStateNormal];
[_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[_button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_button];
[_button mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(weakSelf.view).mas_offset(0.0f);
make.top.mas_equalTo(weakSelf.textField.mas_bottom).mas_offset(40.0f);
}];
} - (void) btnClicked:(UIButton *)btn { [self.navigationController popViewControllerAnimated:YES];
} @end
KLSubViewController
2.1 属性传值
方法描述:在从当前页面跳转到下主页面之前,提前创建下主页面,通过赋值的方式将当前页面的数据赋予下主页面的属性。
适用场景:当从主页面push到子页面时,子页面需要使用到主页面的数据,我们需要使用到正向传值。
传递方式:正向传值。
使用步骤:
- 子页面的.h文件中定义属性来保留要传递过来的数据
//子页面KLSubViewController.h的属性定义
@interface KLSubViewController : UIViewController @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @property (strong, nonatomic) NSString *content;//属性接收数据 @end - 主页面在跳转的时候将数据赋值给子页面对应的属性
//主界面跳转时将数据赋值给对应的属性
@interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
......
} //跳转
- (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
subVC.content = @"来自主界面的数据";
// subVC.textField.text = @"来自主界面的数据"; //这样传递是有问题的,因为子页面中的textfield是在viewDidLoad中进行初始化和布局的,在这时候textfield还没有初始化,为nil,所以赋值是失效的
[self.navigationController pushViewController:subVC animated:YES];
} @end
2.2 代理传值
方法描述:首先在子页面的头文件中添加一个代理(协议)的定义,定义一个传递数据的方法,并且在子页面的类中添加一个代理属性;然后,在子页面返回主页面之前调用代理中定义的数据传递方法(方法参数就是要传递的数据);最后,在主页面中遵从该代理,并实现代理中定义的方法,在方法的实现代码中将参数传递给主页面的属性。
适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。
传递方式:反向传值。
使用步骤:
- 在子页面中添加一个代理协议,在协议中定义一个传递数据的方法
- 在子页面.h文件中添加一个代理属性
//子页面的.h文件,定义代理以及代理属性
// 声明代理
@protocol BToADelegate <NSObject>
// 代理方法
- (void)transferString:(NSString *)string;
@end @interface KLSubViewController : UIViewController @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @property (nonatomic, weak) id<BToADelegate> delegate;//代理属性 @end - 在子页面返回主页面之前掉好用代理中定义数据传递方法,方法参数就是要传递的数据
//子页面返回时调用代理方法
- (void) btnClicked:(UIButton *)btn {
//如果当前的代理存在,并且实现了代理方法,则调用代理方法进行传递数据
if (self.delegate &&
[self.delegate respondsToSelector:@selector(transferString:)]) {
[self.delegate transferString:@"子页面回传的数据"];
}
[self.navigationController popViewControllerAnimated:YES];
} - 在主页面中遵从该代理,并实现代理中定义的方法,在方法的实现代码中将参数传递给主页面的属性
//要实现BToADelegate
@interface KLMainViewController () <BToADelegate> @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
...
} - (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
subVC.delegate = self; //申明子页面的代理是主页面自身self
[self.navigationController pushViewController:subVC animated:YES];
} #pragma mark BToADelegate 代理方法,子页面调用的时候会回调该方法
- (void)transferString:(NSString *)string {
self.textField.text = string;
} @end
2.3 Block传值
方法描述:在子页面中添加一个块语句属性,在子页面返回主页面之前调用该块语句。在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)。这样,在子页面返回主页面时就会调用该回调函数来传递数据。
适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。
传递方式:反向传递。
使用步骤:整个步骤和代理差不多
- 在子页面中添加一个块语句属性
//定义block的类型
typedef void (^TransDataBlock)(NSString *content); @interface KLSubViewController : UIViewController @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @property (copy, nonatomic) TransDataBlock transDataBlock;//定义一个block属性,用于回传数据 @end - 在子页面返回主页面之前调用该块语句
#import "KLSubViewController.h" @interface KLSubViewController () @end @implementation KLSubViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"子界面"; //布局代码省略
......
} - (void) btnClicked:(UIButton *)btn {
//如果回传block存在 则调用该block进行回传数据
if (self.transDataBlock) {
self.transDataBlock(@"子页面回传的数据");
}
[self.navigationController popViewControllerAnimated:YES];
} @end - 在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)
#import "KLMainViewController.h"
#import "KLSubViewController.h" @interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
......
} - (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
//通过子页面的block回传拿到数据后进行处理,赋值给当前页面的textfield
subVC.transDataBlock = ^(NSString *content) {
self.textField.text = content;
};
[self.navigationController pushViewController:subVC animated:YES];
} @end
2.4 通知传值
方法描述:在通知接收方需要注册通知,并指定接收到通知后进行的操作;而在通知发送方则在需要传递数据时发送通知就OK了。通知的操作都是通过NSNotificationCenter来完成的。
但是要注意的两点是:
- 要想能够接收到通知进行处理,必须先注册通知。
- 在注册通知的页面消毁时一定要移除已经注册的通知,否则会造成内存泄漏
注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
适用场景:
- 一般用于已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用通知反向传值。
- 但是也可以用于通过push进入子页面时向子页面传递数据,这时就可以用通知进行正向传值。
传递方式:正向传递(很少这样用)、反向传递(更常用)。
使用步骤:
- 反向传递:
- 在子页面返回的时候发送通知,注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
@interface KLSubViewController () @end @implementation KLSubViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"子界面"; //布局代码省略
.......
} - (void) btnClicked:(UIButton *)btn {
//发送通知回传数据,回传的数据格式自定义,这里定义为dictionary类型
[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"子页面回传的数据"}];
[self.navigationController popViewControllerAnimated:YES];
} - 在主页面注册通知,并制定接收到通知后执行的操作方法。需要注意的是,在注册通知的页面消毁时一定要移除已经注册的通知,否则会造成内存泄漏。
@interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)dealloc {
//移除所有通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 移除某个
// [[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];
} - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
...... //注册通知,用于接收通知,接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];
} //接收通知,解析内容进行处理
- (void)notiReceived:(NSNotification *)sender {
self.textField.text = sender.userInfo[@"content"];
} - (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
[self.navigationController pushViewController:subVC animated:YES];
} @end
- 正向传递:和反向传递的不走基本就是反过来就OK了,但是有一点需要注意的是正向传递时从主界面push到子界面时发送通知,这时候要确保子界面已经注册了通知,否则会收不到通知的,所以正向传递时,子界面通知的注册应该在子界面的初始化init方法中进行。
- 在主页面返回的时候发送通知,注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知。
@interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @end @implementation KLMainViewController - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
......
} - (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
//发送通知回传数据,回传的数据格式自定义,这里定义为dictionary类型
[[NSNotificationCenter defaultCenter] postNotificationName:@"TransDataNoti" object:nil userInfo:@{@"content":@"主页面传递的数据"}];
[self.navigationController pushViewController:subVC animated:YES];
} @end - 在子页面注册通知,并制定接收到通知后执行的操作方法。正向传递时注册通知、基本布局不能放在viewDidLoad中,要放在初始化函数init中。
@interface KLSubViewController () @end @implementation KLSubViewController - (void)dealloc {
//移除所有通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
// 移除某个
// [[NSNotificationCenter defaultCenter] removeObserver:self name:@"TransDataNoti" object:nil];
} - (instancetype)init {
self = [super init]; //初始化代码省略
...... //注册通知,用于接收通知,接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];
return self;
} - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"子界面";
} //接收通知,解析内容进行处理
- (void)notiReceived:(NSNotification *)sender {
self.textField.text = sender.userInfo[@"content"];
} - (void) btnClicked:(UIButton *)btn {
[self.navigationController popViewControllerAnimated:YES];
} @end
2.5 NSUserDefaults传值
方法描述:NSUserDefaults传值是将所要传的值写在沙盒目录里面,需要获取值的时候直接访问沙盒,获取这个值就可以了,这种传值方法一般用在需要将数据本地存储的时候,比如:用户名之类,当用户下次登录或者使用app的时候,可以直接从本地读取。
适用场景:任何需要数据传递的场景都适用,但是传递数据的类型仅限于基本数据类型,不能用于自定义的对象类型。
传递方式:正向传值、反向传值。
使用步骤:
- 需要传值时将数据通过NSUserDefaults保存到沙盒目录里面
- (void) btnClicked:(UIButton *)btn {
/*
setObject:后面写的就是所需要传递的值
forKey:要具有唯一性、一致性;
唯一性是指:当代码中用到多个NSUserDefaults方法时,要保证不同的key不一样,否则就是覆盖值
一致性:这里传递一个值,当需要用到的时候,要用valueForkey的方法,这个key和传值时候写的key要一样,写错了就找不到值了。
*/
[[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults传值" forKey:@"NSUserDefaults"];
[[NSUserDefaults standardUserDefaults] synchronize]; [self.navigationController popViewControllerAnimated:YES];
} - 需要使用值时通过NSUserDefaults从沙盒目录里面取值进行处理
_label.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"NSUserDefaults"];
2.6 单例传值
方法描述:单例传值的性质和NSUserDefaults传值的性质类似,只是单例传值是将数据保存在单例对象中,需要的时候同样从单例对象中去获取数据使用就ok。
适用场景:任何需要数据传递的场景都适用,传递的数据可以是任何类型的数据。
传递方式:正向传值、反向传值均OK。
使用步骤:
- 创建一个类,拥有一些属性用于保存数据,并实现单例方法
@interface KLDanliObj : NSObject @property (nonatomic, copy) NSString *content; //保存数据数据的属性 + (instancetype) shardDanLiObj; //单例对象获取方法 @end
#import "KLDanliObj.h" static DanLi *danli = nil; @implementation KLDanliObj + (instancetype) shardDanLiObj {
//实现方法,判断是否为空,是就创建一个全局实例给它
if (danli == nil) {
danli = [[KLDanliObj alloc] init];
}
return danli;
} @end - 需要传递数据时使用单例类将数据保存到单例的属性中
[KLDanliObj shardDanLiObj].content = @"主界面传递的数据";
- 需要使用值时通过单例的属性获取数据进行使用和处理
self.textField.text = [KLDanliObj shardDanLiObj].content;
2.7 KVC传值
方法描述:KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法,这样就可以在运行时动态地访问和修改对象的属性。这其实和属性传值比较类似。
适用场景:当从主页面push到子页面时,子页面需要使用到主页面的数据,我们需要使用到正向传值。
传递方式:正向传值
使用步骤:
- 在需要传值时使用KVC给子页面的属性进行赋值就ok了
- (void) btnClicked:(UIButton *)btn {
KLSubViewController *subVC = [[KLSubViewController alloc] init];
//给子页面subVC的属性content赋值 和subVC.content = @"主页面传递的数据";效果一样
[subVC setValue:@"主页面传递的数据" forKey:@"content"];
[self.navigationController pushViewController:subVC animated:YES];
}
2.8 KVO传值
方法描述:KVO(Key-Value-Observing,键值观察),即观察关键字的值的变化。首先在子页面中声明一个待观察的属性,在返回主页面之前修改该属性的值。在主页面中提前分配并初始化子页面,并且注册对子页面中对应属性的观察者。在从子页面返回上主之前,通过修改观察者属性的值,在主页面中就能自动检测到这个改变,从而读取子页面的数据。
适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。
传递方式:反向传递。
使用步骤:
- 在主页面注册观察者,实现KVO的回调方法,并在主页面销毁时移除观察者
@interface KLMainViewController () @property (strong, nonatomic) UITextField *textField;
@property (strong, nonatomic) UIButton *button; @property (strong, nonatomic) KLSubViewController *subVC; @end @implementation KLMainViewController - (void)dealloc {
//移除观察者
[self.subVC removeObserver:self forKeyPath:@"content"];
} - (void)viewDidLoad {
[super viewDidLoad];
self.title = @"主界面"; //布局代码省略
....... } - (void) btnClicked:(UIButton *)btn {
if (!_subVC) {
_subVC = [[KLSubViewController alloc] init];
//注册观察者
[_subVC addObserver:self forKeyPath:@"content" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];
}
[self.navigationController pushViewController:_subVC animated:YES];
} // KVO的回调,当观察者中的数据有变化时会回调该方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"content"]){
self.textField.text = self.subVC.content;
}
} @end - 子页面在返回主页面时修改对应属性的内容,则会回调主页面的回调方法
- (void) btnClicked:(UIButton *)btn {
self.content = @"子页面回传数据";//修改属性的内容
[self.navigationController popViewControllerAnimated:YES];
}
iOS学习——页面的传值方式的更多相关文章
-
iOS学习之六种传值方式
iOS页面传值方式 应用于: 两个互动的界面:1)页面一跳转到页面二,页面一的textField的值传给页面二的label.2)A页面跳转到B页面,B页面再跳转回A页面(注册页面跟登录页面) 两个不互 ...
-
ios学习-delegate、传值、跳转页面
ios学习-delegate.传值.跳转页面 1.打开xcode,然后选择ios--Application--Empty Application一个空项目. 项目目录: 2.输入项目名称以及选 ...
-
JavaWeb学习——页面跳转方式
JavaWeb学习——页面跳转方式 摘要:本文主要学习了请求转发和响应重定向,以及两者之间的区别. 请求转发 相关方法 使用HttpServletRequest对象的 getRequestDispat ...
-
asp.net页面间传值方式
使用asp.net开发项目,必然会在页面间进行传值,本文介绍几种常见的页面传值方式,仅作笔记,以便后续查找使用. 前提:新建两个页面:ValuePage.aspx,ObtainValue.aspx,本 ...
-
MVC中页面的传值方式总结
MVC中的页面传值,通常指Controller和view之间的数据传递,经常用到的有几种方式,总结如下: 一:ViewData 获取或设置一个字典,其中包含在控制器和视图之间传递的数据.使用ViewD ...
-
页面之间传值方式的总结,五种方式,通知,block,代理,单例,NSUERDEFALUT,
首先代码拿上 1:单例 2:通知 3:代理 4:block方法 5:NSUSERDEFAULT(沙盒文件) 先是单例类: .h文件 @interface DataSource : NSObject @ ...
-
Asp.net页面间传值方式汇总
七种传值方式,分别是:URL传值,Session传值,Cookie传值,Server.Transfer传值,Application传值,利用某些控件的PostBackUrl属性和使用@Previous ...
-
iOS的四种传值方式
传值有四种方法 : 1. 属性传值 2. 单例传值 3. 代理传值 4. block传值 一.属性传值 (前-->后) 1. 后面的界面定义一个属性 存放前一个界面传过来的值 ...
-
【转】ios -- ViewController跳转+传值(方式一)
方式一:通过定义一个实体类传值 (从ViewController1 跳转至 ViewController2) 1.定义实体类NotificationEntity .h声明文件 #import < ...
随机推荐
-
easyui menubutton combobox 被遮盖问题
如图一所示,menubutton 中的 combobox 被遮盖 z-Index 不够.这是作者给出的解决方案 <a href="#" class="easyui- ...
-
sed文本处理知识点整理
参考资料:http://man.linuxde.net/sed <鸟哥的私房菜> sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用.sed 后面接的操作 ...
-
汉诺塔算法的递归与非递归的C以及C++源代码
汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...
-
shell修改文件名(一)
假如文件名是:time_filename.txt 改成filename_time.txt.例如20111111_me.txt改成me_201111111.txt要如何修改? #! /bin/sh fo ...
-
android 音频播放总结 soundlPool,MediaPlay
soundlPool 用于小音频的播放多个同时播放. 使用步骤: 步骤一: 首先下载音频文件可以将其放入assets文件夹下或者res下的raw文件夹下,区别在于assets下可以再新建文件夹二raw ...
-
.net程序员做的第一个安卓APP
我从毕业之后一直做的是ASP.NET,从毕业到现在都已经五六个年头了.一个事物接触久了就会慢慢没有了新鲜感热情也褪去的差不多了,我又是对新事物比较感兴趣的,虽说Android早就不算什么新事物,当对于 ...
-
LeetCode - 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索树. ...
-
Verilog强制激励语法
Verilog强制激励语法 1. 在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值. 过程连续赋值往往是不可以综合的,通常用在测试模块中. 两种方式都有各自配套的命令来停止赋值过程. ...
-
WINAPI实现简易扫雷游戏
//扫雷 #include <windows.h> #include <windowsx.h> #include <strsafe.h> #include < ...
-
BZOJ2217 [Poi2011]Lollipop 【贪心】
题目链接 BZOJ2217 题解 如果只判定存不存在方案的话,我倒是想到可以将\(2\)拆成两个\(1\),其中一个不能作为区间开头,线段树优化计算补集方案数 但是一看这道题要输出方案啊,,, 怎么办 ...