- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解iOS页面传值(顺传 逆传)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
代理协议传值 。
顺传 。
假设A为第一个视图控制器,B为第二个视图控制器 。
在A中导入B的.h文件 。
场景:A向B传值 。
第一步:在B的.h中定义一个content属性 。
1
2
3
|
@interface
SecondViewController : UIViewController
@property
(nonatomic,copy)NSString *contents;
@end
|
第二步:在点击A中的按钮方法里面给B的content属性赋值 。
1
2
3
4
5
6
7
|
- (
void
)buttonAction:(UIButton *)button
{
NSLog(@
"进入第二页"
);
SecondViewController *secondVC = [SecondViewController alloc] init];
secondVC.contents = self.label.text;
[self.navigationController pushViewController:secondVC animated:YES];
}
|
第三部:在B使用content的属性给相应的控件赋值 。
1
2
3
4
5
6
|
@implemention
SecondViewController
- (
void
)viewDidLoad {
[
super
viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = self.contents;
}
|
逆传 。
代理传值使用在两个界面传值的之后,从后向前传值.
假设A为第一个视图控制器,B为第二个视图控制器 。
场景:B向A传值 。
第一步:首先在B的.h文件中声明协议和协议方法 。
第二步:在B的.h中声明一个代理属性,这里主要注意用assign或weak修饰,weak和assign是一种非拥有关系的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用的对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。所以,用weak更安全些.
@property (nonatomic,weak)id<协议名>delegate; 。
1
2
3
4
5
6
7
8
9
10
|
#pragma mark 这里是B的.h
#
import
<UIKit/UIKit.h>
@protocol
CsutomTabBarDelegate<NSObject>
// 把btn的tag传出去的方法
- (
void
)selectedIndexWithTag:(NSInteger)tag;
@end
@interface
CustomTabBarView : UIView
//声明一个代理属性delegate
@property
(nonatomic,weak)id<CsutomTabBarDelegate>delegate;
@end
|
第三部:在B即将POP回前一个界面的时候,在pop方法的上一行使用协议方法传递数据[self.delegate 协议方法名:(参数,也就是要传回的数据) 。
1
2
3
4
5
6
7
8
9
10
11
12
|
#pragma mark 这里是B的.m
// 判断在制定的代理类中是否实现了该协议方法
// 确保执行时无此方法时不崩溃
if
([self.delegate respondsToSelector:
@selector
(selectedIndexWithTag:)])
{
// 执行代理方法
[self.delegate selectedIndexWithTag:(sender.tag -
1000
)];
}
else
{
NSLog(@
"协议中的方法没有实现"
);
}
|
在A的.m中,在push到B界面方法之前,B对象的初始化之后,指定A对象为B对象的代理(B对象).delegate = self此时会有黄色警告,因为没有准守协议 。
1
2
3
|
#pragma mark A的.m中
// 指定代理,B就是customView
customView .delegate = self;
|
第五步:在A的延展或者A的.h文件中导入协议名称<协议名称> 。
1
2
3
4
|
#pragma mark A的.m的延展里,A就是RootTabBarController
// 协议导入
@interface
RootTabBarController () <CustomTabBarDelegate>
@end
|
第六步:在A的.m中事项协议方法,取得参数中得知,呈现在当前界面上 。
1
2
3
4
5
6
|
#pragma mark A的.m
// 实现代理方法,这里就可以使用从B传来的值了
- (
void
)selectedIndexWithTag:(NSIngeter)tag
{
self.selectedIndex = tag;
}
|
使用Block页面间传值 。
第一步:在B的.h中重定义一个block,用这个重定义的block类型声明一个类的属性这里要注意用copy修饰block属性 。
1
2
3
4
5
6
7
8
9
|
#pragma mark B的.h
#
import
<UIKit/UIKit.h>
// block传值
// 重命名一个有参无返回值的block类型
typedef
void
(^passValue)(NSInteger tag);
@interface
CustomTabBarView : UIView
//用这个block类型定义一个属性
@property
(nonatomic,copy)passValue passValueTag;
@end
|
第二步:在B的.m的返回方法中调用block的方法 。
1
2
3
|
#pragma mark B的.m的返回方法中
//调用block方法
self.passValueTag(sender.tag -
1000
);
|
第三步:在A的.m中创建B的实例的地方,为B的block属性赋值,也就是说,写好这个block中的内容,类似于给B的某一个属性赋初值 。
1
2
3
4
5
|
// 设置block内容
customView.passValueTag = ^(NSInteger tag)
{
self.selectedIndex = tag;
};
|
没有引用局部变量的Block内存存储在全局区 。
引用了局部变量的Block内存存储在栈区 。
当对Block进行copy操作的时候Block的内存存在堆区 。
Block的循环引用问题 。
当Block是self的一个属性的时候 。
self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";},
会导致self的引用计数+1,最终导致循环引用 。
在ARC下使用weak修饰变量防止循环引用 。
在非ARC下使用block修饰变量防止循环引用 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://www.cnblogs.com/Dog-Ping/p/6127280.html 。
最后此篇关于详解iOS页面传值(顺传 逆传)的文章就讲到这里了,如果你想了解更多关于详解iOS页面传值(顺传 逆传)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!