iOS几种页面传递方

一.委托代理传值

1.步骤

1.1  设置协议及方法(B界面实现)

1 @protocol secondViewDelegate
2 -(void)showName:(NSString *)nameString;

1.2设置代理(B界面实现)

1 @property (nonatomic, weak)id<secondViewDelegate> delegate;

1.3调用代理(B界面实现)

1 - (IBAction)delegateMethod:(id)sender {
2     if ([self notEmpty]) {
3         [self.delegate showName:self.nameTextField.text];
4         [self dismissViewControllerAnimated:YES completion:nil];
5     }else{
6         [self showAlert];
7     }
8 }

1.4.实现,显示所传的值(A界面实现)

1 -(void)showName:(NSString *)nameString{ 2 self.nameLabel.text = nameString; 3 }

2.1委托需要做的工作有:(要求传值的一方是委托,既B界面)

2.1.1定义协议与方法

2.1.2声明委托变量

2.1.3设置代理

2.1.4通过委托变量调用委托方法

2.2.代理需要做的工作有:(接收传值的一方是代理一方,既A界面)

2.2.1遵循协议

2.2.2实现委托方法

二.通知传值

1.步骤

1.1.创建一个通知对象(B界面实现)

1 //通知:1.创建一个通知对象及发送通知
2 - (IBAction)notificationMethod:(id)sender {
3     if ([self notEmpty]) {
4         [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeNameNotification" object:self userInfo:@{@"name":self.nameTextField.text}];
5         [self dismissViewControllerAnimated:YES completion:nil];
6     }else{
7         [self showAlert];
8     }
9 }

1.2.注册通知(A界面实现)

1 - (void)viewDidLoad
2 {
3     [super viewDidLoad];
4     // 通知2:注册通知
5     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:) name:@"ChangeNameNotification" object:nil];
6 }

1.3发送通知(B界面实现)

1.4接收通知(A界面实现)

1 //通知4:调用、显示通知
2 -(void)ChangeNameNotification:(NSNotification*)notification{
3     NSDictionary *nameDictionary = [notification userInfo];
4     self.nameLabel.text = [nameDictionary objectForKey:@"name"];
5 }

1.5移除通知(A界面实现)

//通知3:不使用时,删掉通知
-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

2.优缺点分析

优点:通知的发送者和接受者不需要知道对方,可以指定接收通知的具体方法。通知名可以是任何字符串

缺点:较键值观察需要多点代码,在删除前必须移除监听者。不能传大量数值,只能让谁去做什么事

三.通过block传值

1.步骤

1.block定义,并申明一个block属性(在B界面实现)

1 typedef void (^ablock)(NSString *str);

1 @property (nonatomic, copy) ablock block;//定义一个block属性

2.输入需要传值的对象,点击相应按钮(在B界面实现)

 1 //block传值2:在B试图控制器中,当输入名字,点击对应的确定按钮后
 2 - (IBAction)blockMethod:(id)sender {
 3     if ([self notEmpty]) {
 4         if (self.block) {
 5             self.block(self.nameTextField.text);
 6             [self dismissViewControllerAnimated:YES completion:nil];
 7         }
 8     }else{
 9         [self showAlert];
10     }
11 }

3.回调block实现传值(在A界面实现)

1 - (IBAction)showSecondWithBlock:(id)sender {
2     SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
3     second.flag = 1;
4     [self presentViewController:second animated:YES completion:nil];
5     second.block = ^(NSString *str){
6         self.nameLabel.text = str;
7     };
8 }

四.通过NSUserdefault来传值

步骤

1. 通过NSUserdefault来存值(在B界面实现)

1 //通过文件或者UserDefault方式存值
2 - (IBAction)userDefaultMethod:(id)sender {
3     if ([self notEmpty]) {
4         [[NSUserDefaults standardUserDefaults] setObject:self.nameTextField.text forKey:@"myNameText"];
5         [self dismissViewControllerAnimated:YES completion:nil];
6     }else{
7         [self showAlert];
8     }
9 }

2. 通过NSUserdefault来取值(在A界面实现)

1 //   通过UserDefault方式取值
2
3     if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"] length] != 0) {
4         self.nameLabel.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"myNameText"];
5         [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"myNameText"];
6     }

NSUserDefaults用法注意点

NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。

NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型

五.单例传值

1.步骤

1.1定义一个单例类,并在类里面定义一个要监控的属性以及建立一个单例对象

1 #import <Foundation/Foundation.h>
2
3 @interface DataSource : NSObject
4 @property (nonatomic, strong) NSString *myName;//要监视的属性
5 +(DataSource*)sharedDataSource;//建立单例对象
6 @end
 1 #import "DataSource.h"
 2
 3 @implementation DataSource
 4 +(DataSource *)sharedDataSource{
 5     static DataSource *dataSource = nil;
 6     static dispatch_once_t once;
 7     dispatch_once(&once, ^{
 8         dataSource = [DataSource new];
 9     });
10     return dataSource;
11 }
12 @end

1.2.写入需要传值的对象(B界面实现)

 1 //通过单例方式传值:写入要传入的数据
 2 - (IBAction)singletonMethod:(id)sender {
 3     if ([self notEmpty]) {
 4         DataSource *dataSource = [DataSource sharedDataSource];
 5         dataSource.myName = self.nameTextField.text;
 6         [self dismissViewControllerAnimated:YES completion:nil];
 7     }else{
 8         [self showAlert];
 9     }
10 }

1.3.通过单例传值方法获取对象(A界面实现)

 1 //通过单例取值
 2
 3     DataSource *dataSource = [DataSource sharedDataSource];
 4
 5     if ([dataSource.myName length] != 0) {
 6
 7         self.nameLabel.text = dataSource.myName;
 8
 9         dataSource.myName = @"";
10
11     }

六、代理传值与通知传值间的比较

1.效率肯定是delegate比nsnotification高

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。相反的,notification最大的特色就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。

二、Delegate与单例KVO和NSNotification的区别:

和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是

1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;

2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

时间: 2024-09-24 08:45:05

iOS几种页面传递方的相关文章

MVC 从后台页面 取前台页面传递过来的值的几种取法

MVC 从后台页面 取前台页面传递过来的值的几种取法 <1>前台页面 Index视图 注意:用户名表单的name值为txtName 密码表单的name值为txtPassword 1 <html> 2 <head> 3 <meta name="viewport" content="width=device-width" /> 4 <title>Test</title> 5 </head>

ios常见的页面传值方式

iOS页面间的传值细分有很多种,基本的传值方式有三种:委托Delegate传值.通知NSNotification传值.Block传值,其他在项目中可能会遇到的还有:UserDefault或文件方式传值.单例模式传值.通过设置属性传值,再有其他的传值方式没有遇到使用过在此不做说明.场景适合,自己使用舒服就是好的方式. 在iOS开发的过程中,常见的页面跳转传值方式大致可以分为两种,现归纳总结一下: 第一种:OneViewController页面跳转到TwoViewController页面(即顺传)

iOS中的事件传递和响应者链条

iOS中的事件传递和响应者链条 本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UIApplication管理的队列事件中来 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会发发送事件给应用程序的主窗口 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图

HBuilder开发App教程08-几种页面打开方式

说明 上节说了list页面的实现,其中关于几种页面的打开方式没有详细述说, 本节详细述说下几种页面打开方式的区别. 几种打开页面的方式 1.初始化时创建子页面 2.直接打开新页面 3.预加载页面 示例 1.初始化时创建子页面 mui.init({ subpages: [{ url: your - subpage - url, //子页面HTML地址,支持本地地址和网络地址 id: your - subpage - id, //子页面标志 styles: { top: subpage - top

Android ios嵌套web页面

我们现在做一个活动页面,Android和ios的活动页面用web来做,方便更改,下面有几个小问题: 1.在Android和ios中,虽然web上面可以存localstorage,但是到了Android和ios上面就失效了,也就是说不能存储localstorage,而cookie是可以存储: 2.Android和ios传参给web页面这个和简单,只需要在web端写一个正常的函数,在Android和ios直接调用方法,以下的data就是传回来的参数,如 function receiveAppWish

Ajax打开三种页面的请求

xmlhttprequest对象可以打开两种方式的页面请求 1,.asmx格式的webservice页面. 2,.aspx格式的web窗体 其中web窗体可以是调用一新建的web窗体,同时调用和被调用页面可以是同一个页面,表达的可能不够清楚,还是看示例吧. 一.调用.asmx格式的webservice页面 1,新建一个ASP.NET应用程序,在该应用程序中添加一web服务页面(webservice页面),此时项目中有三个页面,web窗体页面(Default.aspx).webservice页面(

php SESSION 不能跨页面传递

今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下: session是服务器端的一种会话机制,当客户端的请求服务器创建一个session时,服务器会先检测该请求里面是否包含一个惟一的 sessionID,如果是,说明服务器已经为该用户创建过session,只要按照该sesionID检索出该用户的session供用户使用,如果没 有sessionID,服务器会为该用户新建一个带有唯一表示服sessionID的session.创建完

php session跨页面传递 session值丢失问题之完美解决

今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下: session是服务器端的一种会话机制,当客户端的请求服务器创建一个session时,服务器会先检测该请求里面是否包含一个惟一的sessionID,如果是,说明服务器已经为该用户创建过session,只要按照该sesionID检索出该用户的session供用户使用,如果没有sessionID,服务器会为该用户新建一个带有唯一表示服sessionID的session.创建完成后

如何评价苹果中国官网 iOS 8 介绍页面的文案「开发者的大事、大快所有人心的大好事」?[转自知乎]

在什么是「苹果式中文」答案中,小七得出了这个结论: 「苹果式中文」是指句子结构破碎,经常缺乏主语,滥用排比,顶真,偏正短语,和不恰当四字词的广告文体. (有关什么是苹果式中文,小七原来贴错地方了TAT,具体分析请移步:什么是「苹果式中文」?) 那么作为广告翻译,苹果做得如何呢? 首先,有个翻译的概念需要向大家普及: 很多知友提出文案有明显的翻译腔,这个说法其实不准够确啊,有关什么是翻译腔,我的分析请移步:什么是「翻译腔」?「翻译腔」是好是坏? 在这里节选原文一段补充说明: 3. 明明能说中文,非