ios appios开发 模态传值一般怎么传值

主题 : 新人求助,ios开发中 俩个ViewController之间如何传值
级别: 新手上路
UID: 418699
可可豆: 94 CB
威望: 93 点
在线时间: 289(时)
发自: Web Page
来源于&&分类
新人求助,ios开发中 俩个ViewController之间如何传值&&&
如题我自己给controller 设置了一样的属性 跳转的时候 赋值想问问 真正开发的时候 一般用什么方法&&通知中心? 还是之间页面做代理?
级别: 新手上路
UID: 115948
可可豆: 65 CB
威望: 58 点
在线时间: 210(时)
发自: Web Page
一般,往前跳(push)传值用属性,往回跳(pop)传值用delegate,多级跳(popToRoot)传值用通知;
图片胜过千言万语,界面抵得上千图片 ——Ben Shneiderman
级别: 侠客
可可豆: 124 CB
威望: 124 点
在线时间: 353(时)
发自: Web Page
正向传值很容易,这个就不多说了,主要还是反向传值多页面的传值通知中心,或者单例大部分都是用 block代理现在都不会写了以上是我自己的方法,其他人不太清楚
UID: 123750
发帖: 1787
可可豆: 3130 CB
威望: 3061 点
在线时间: 1138(时)
发自: Web Page
很多种,初级的可以用通知中心、直接赋值 中级的用代理 高级的用block 不嫌蛋疼用kvo
UID: 123750
发帖: 1787
可可豆: 3130 CB
威望: 3061 点
在线时间: 1138(时)
发自: Web Page
或者,全局指针。。。。。把你controller搞个全局指针,谁想用拉起来就用。。。。。。
级别: 侠客
UID: 307346
可可豆: 325 CB
威望: 242 点
在线时间: 211(时)
发自: Web Page
coding ing...
级别: 新手上路
UID: 418699
可可豆: 94 CB
威望: 93 点
在线时间: 289(时)
发自: Web Page
回 1楼(china_ludawei) 的帖子
级别: 骑士
UID: 231282
可可豆: 384 CB
威望: 370 点
在线时间: 1678(时)
发自: Web Page
沙发说的好,pop现在基本上blocl回调用的多
级别: 骑士
UID: 295190
可可豆: 943 CB
威望: 817 点
在线时间: 1473(时)
发自: Web Page
用block吧,简单好用
级别: 新手上路
UID: 316729
可可豆: 280 CB
威望: 189 点
在线时间: 148(时)
发自: Web Page
代理 通知中心&&等,我的,临时会话可以
有一个朋友说我帅气的很,这哥们忒爱说真话,没办法,人家就是有眼光
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版第二个视图控制器如何获取第一个视图控制器的部分信息
例如 :第二个界面中的lable显示第一个界面textField中的文本
这就需要用到属性传值、block传值
那么第一个视图控制器如何获的第二个视图控制器的部分信息
例如:第一个界面中的lable显示第二个界面textField中的文本
这就需要使用代理传值
页面间传值有八大传值方式,下面我们就简单介绍下页面间常用的五种传值方式:
(一)属性传值&
第二个界面中的lable显示第一个界面textField中的文本
首先我们建立一个RootViewControllers和一个DetailViewControllers,在DetailViewControllers中声明一个textString属性,用于接收传过来的字符串,
同时创建一个Lable用来显示传过的字符串
在RootViewControllers上引入DetailViewControllers同时声明一个textField属性用来输入字符串
然后在RootViewControllers上我们创建并添加一个button,当点击button时响应相应方法进行视图间的切换完成视图间的传值
(二)Block传值
block传值也是从第二个界面给第一个界面传值
首先我们在DetailViews的.h文件中,属性
在RootViewControllers的.m文件中,其他不变,在button的响应方法里我们为block属性赋值完成block传值
(三)代理传值
RootViewControllers页面push到DetailViewControllers页面,如果DetailViewControllers页面的信息想回传(回调)到RootViewControllers页面,用代理传值,其中DetailViewControllers定义和声明代理,RootViewControllers确认并实现代理,RootViewControllers作为DetailViewControllers的代理
首先在DetailViewControllers.h文件中我们创建协议方法
在DetailViewControllers的.m中我们判定代理对象存在时,为其绑定相应方法
RootViewControllers的.m文件中我们指定代理并让其执行代理的方法
(四)单例传值
单例传值(实现共享)
AppStatus.h &创建一个单例类 AppStatus
1 #import &/Foundation.h&
3 @interface AppStatus : NSObject
NSString *_contextS
8 @property(nonatomic,retain)NSString *contextS
10 +(AppStatus *)shareI
AppStatus.m
1 #import "AppStatus.h"
3 @implementation AppStatus
5 @synthesize contextStr = _contextS
7 static AppStatus *_ =
9 +(AppStatus *)shareInstance
if (_instance == nil)
_instance = [[super alloc]init];
18 -(id)init
if (self = [super init])
27 -(void)dealloc
[super dealloc];
RootViewController.h
1 #import "RootViewController.h"
2 #import "DetailViewController.h"
3 #import "AppStatus.h"
5 @interface RootViewController ()
9 @implementation RootViewController
11 -(void)loadView
//核心代码
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 100, 30);
[btn setTitle:@"Push" forState:0];
[btn addTarget:self action:@selector(pushAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
21 -(void)pushAction:(id)sender
tf = (UITextField *)[self.view viewWithTag:1000];
//单例传值
将要传递的信息存入单例中(共享中)
[[AppStatus shareInstance]setContextStr:tf.text]; 跟下面这种写法是等价的
[AppStatus shareInstance].contextStr = tf.
//导航push到下一个页面
//pushViewController 入栈引用计数+1,且控制权归系统
DetailViewController *detailViewController = [[DetailViewController alloc]init];
//导航push到下一个页面
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
DetailViewController.h
1 #import &UIKit/UIKit.h&
2 @protocol ChangeD//通知编译器有此代理
4 @interface DetailViewController : UIViewController
UITextField *textF
DetailViewController.m
1 #import "DetailViewController.h"
2 #import "AppStatus.h"
4 @interface DetailViewController ()
8 @implementation DetailViewController
10 @synthesize naviTitle = _naviT
12 -(void)loadView
self.view = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]autorelease];
self.title = [AppStatus shareInstance].contextS
textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];
textField.borderStyle = UITextBorderStyleL
[self.view addSubview:textField];
[textField release];
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];
self.navigationItem.rightBarButtonItem = doneI
[doneItem release];
28 //这个方法是执行多遍的
相当于刷新view
29 -(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
tf = (UITextField *)[self.view viewWithTag:1000];
tf.text = [AppStatus shareInstance].contextS
36 //pop回前一个页面
37 -(void)doneAction:(id)sender
//单例传值
[AppStatus shareInstance].contextStr = textField.
[self.navigationController popToRootViewControllerAnimated:YES];
(五)通知传值
谁要值的变化,谁就注册通知 &特别要注意,通知的接受者必须存在这一先决条件
A页面RootViewController.h
1 #import &UIKit/UIKit.h&
2 #import "DetailViewController.h"
3 @interface RootViewController : UIViewController&ChangeDelegate&
UITextField *
A页面RootViewController.m
1 #import "IndexViewController.h"
2 #import "DetailViewController.h"
3 #import "AppStatus.h"
5 @implementation IndexViewController
7 -(void)dealloc
[[NSNotificationCenter defaultCenter] removeObserver:self
name:@"CHANGE_TITLE" object:nil];
[super dealloc];
14 -(id)init
if (self = [super init])
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(change:)
name:@"CHANGE_TITLE"
object:nil];
26 -(void)change:(NSNotification *)aNoti
// 通知传值
NSDictionary *dic = [aNoti userInfo];
NSString *str = [dic valueForKey:@"Info"];
UITextField *tf =
(UITextField *)[self.view viewWithTag:1000];
36 -(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
// 单例传值
UITextField *tf =
(UITextField *)[self.view viewWithTag:1000];
tf.text = [AppStatus shareInstance].contextS
DetailViewController.h
1 #import &UIKit/UIKit.h&
2 @protocol ChangeD//通知编译器有此代理
4 @interface DetailViewController : UIViewController
UITextField *textF
&DetailViewController.m
1 #import "DetailViewController.h"
2 #import "AppStatus.h"
4 @implementation DetailViewController
5 @synthesize naviTitle = _naviT
7 -(void)loadView
UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];
self.navigationItem.rightBarButtonItem = doneI
[doneItem release];
14 // pop回前一个页面
15 -(void)doneAction:(id)sender
17 NSDictionary *dic = [NSDictionary dictionaryWithObject:textField.text forKey:@"Info"];
19 [[NSNotificationCenter defaultCenter] postNotificationName:@"CHANGE_TITLE" object:nil userInfo:dic];
21 [self.navigationController popViewControllerAnimated:YES];
没有下一篇了!iOS两个app之间跳转及其传值
iOS两个app之间跳转及其传值
& 在做开发时,有时候可能会用到两个app之间切换传值之类的,主要用的是:
[[UIApplication sharedApplication] openURL:url];
& 下面就写一下具体的操作步骤:
1.在工程一中:
2.在需要跳转的地方写下面的代码:
NSString *urlStr = [NSString stringWithFormat:@&TestSwitchTwo://%@&,@&测试一下&];
iOS9以下用
stringByAddingPercentEscapesUsingEncoding
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:urlStr]]];
[[UIApplication sharedApplication] openURL:url];
这个地方需要注意一下,如果需要传入汉字需要转码,不然会出现
LaunchServices: ERROR: There is no registered handler for URL scheme (null);
iOS9以下用:
stringByAddingPercentEscapesUsingEncoding;
iOS9以上用:
stringByAddingPercentEncodingWithAllowedCharacters;
3.在工程二中:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary&NSString *,id& *)options{
NSString *str111 = [[url host] stringByRemovingPercentEncoding];
return YES;
iOS9以下用
stringByReplacingPercentEscapesUsingEncoding解码;
这样,就能跳转到第二个工程并传值过去。
注:如果是用模拟器,要将要跳转到的那个工程运行起来,然后才进行从第一个工程切换到另一个工程。
我的热门文章
即使是一小步也想与你分享winann 的BLOG
用户名:winann
文章数:26
评论数:85
访问量:94107
注册日期:
阅读量:5863
阅读量:12276
阅读量:387862
阅读量:1078994
51CTO推荐博文
&&&&&&&&使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值:&&&&&&&&先说一下思想:&&&&&&&&首先,创建两个视图控制器,在第一个视图控制器中创建一个UILabel和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面。&&&&&&&&第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显示在UILabel上。其实核心代码就几行代码:下面是主要代码:(因为我是用storyBoard创建的工程,所以上面的属性和相应的方法,是使用系统生成的outlet)一、在第二个视图控制器的.h文件中定义声明Block属性typedef&void&(^ReturnTextBlock)(NSString&*showText);
@interface&TextFieldViewController&:&UIViewController
@property&(nonatomic,&copy)&ReturnTextBlock&returnTextB
-&(void)returnText:(ReturnTextBlock)
@end&&&&&&&&第一行代码是为要声明的Block重新定义了一个名字&&&&ReturnTextBlock&&&&&&&&这样,下面在使用的时候就会很方便。&&&&&&&&第三行是定义的一个Block属性&&&&&&&&第四行是一个在第一个界面传进来一个Block语句块的函数,不用也可以,不过加上会减少代码的书写量二、实现第二个视图控制器的方法-&(void)returnText:(ReturnTextBlock)block&{
&&&&self.returnTextBlock&=&
-&(void)viewWillDisappear:(BOOL)animated&{
&&&&if&(self.returnTextBlock&!=&nil)&{
&&&&&&&&self.returnTextBlock(self.inputTF.text);
}&&&&&&&&其中inputTF是视图中的UITextField。&&&&&&&&第一个方法就是定义的那个方法,把传进来的Block语句块保存到本类的实例变量returnTextBlock(.h中定义的属性)中,然后寻找一个时机调用,而这个时机就是上面说到的,当视图将要消失的时候,需要重写:-&(void)viewWillDisappear:(BOOL)方法。三、在第一个视图中获得第二个视图控制器,并且用第二个视图控制器来调用定义的属性如下方法中书写:-&(void)prepareForSegue:(UIStoryboardSegue&*)segue&sender:(id)sender
&&&&//&Get&the&new&view&controller&using&[segue&destinationViewController].
&&&&//&Pass&the&selected&object&to&the&new&view&controller.
&&&&TextFieldViewController&*tfVC&=&segue.destinationViewC
&&&&[tfVC&returnText:^(NSString&*showText)&{
&&&&&&&&self.showLabel.text&=&showT
}& & &可以看到代码中的注释,系统告诉我们可以用[segue destinationViewController]来获得新的视图控制器,也就是我们说的第二个视图控制器。&&&&&&&&这时候上面(第一步中)定义的那个方法起作用了,如果你写一个[tfVC returnText按回车&,系统会自动提示出来一个:tfVC returnText:&#^(NSString *showText)block#&的东西,我们只要在焦点上回车,就可以快速创建一个代码块了,大家可以试试。这在写代码的时候是非常方便的。附件中是完整的工程代码,大家可以运行看看效果本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:    
类别:┆阅读(0)┆评论(0)
16:04:51 10:48:07 09:35:00 09:35:34 15:08:16 15:12:12
请输入验证码:

我要回帖

更多关于 ios 开发单例数组传值 的文章

 

随机推荐