A. ios 属性传值问题

1、属性传值 前向后传值。
2、协议传值
3、Block传值 代替协议代理传值,主要时间点问题。
4、单利传值 数据共享
5、通知传值
通知中心
NSNotificationCenter提供了一种更加解耦的方式。最典型的应用就是任何对象对可以发送通知到中心,同时任何对象可以监听中心的通知。
发送通知的代码如下:

[[] postNotificationName:@”myNotificationName” object:broadcasterObject];
注册接收通知的代码如下:

[[] addObserver:listenerObject selector:@selector(receivingMethodOnListener:) name:@”myNotificationName” object:nil];
注册通知的时候可以指定一个具体的广播者对象,但这不是必须的。你可能注意到了defaultCenter。实际上这是你在应用中会使用到的唯一的中心。通知会向整个应用开放,因此只有一个中心。
同时还有一个。这是用来应用间通信的。在整个计算机上只有一个该类型的中心。
优点: 通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点: 较键值观察需要多点代码。在删掉前必须移除监听者。不能传大量数值,只能让谁去做什么事。

B. ios app开发一般怎么传值

ios app开发传值的方法很多,具体如下:
1: 属性传值第一步需要用到什么类型就定义什么样的属性
从上一个页面到一个页面的选中方法里面将要传的值传到来(上一个页面)备注:这种方法只适用于上一个页面推到下一个页面
MainViewController与SecondViewController两个视图 控制器 ,点击MainViewController中的按钮将跳转到SecondViewController视图,同时想要传递一个值过去。这时可以利用属性传值。

首先SecondViewController视图中需要有一个属性用来 存储 传递过来的值:
@property(nonatomic,retain) NSString *firstValue ;//属性传值
然后MainViewController视图需要引用SecondViewController视图的头文件,在视图中的按钮点击事件中,通过SecondViewController的对象将需要传递的值存在firstValue中:
-(void)buttonAction:(UIButton *)button

{
SecondViewController *second = [[SecondViewController alloc]init];//用下一个视图的属性接受想要传过去的值,属性传值
second.firstValue = _txtFiled.text;
[self.navigationController pushViewController:second animated:YES];
}
页面跳转之后,就能在SecondViewController视图中,通过存值的属性,取用刚才传递过来的值:

//显示传过来的值

[_txtFiled setText:_firstValue];//firstValue保存传过来的值
2、方法传值:
需求同一中的 属性传值 一样,但是要通过使用方法传值,可以直接将方法与初始化方法合并,此时当触发MainViewController的按钮点击事件并跳转到SecondViewController时,在按钮点击事件中可以直接通过SecondViewController的初始化,将值保存在firstValue中:

初始化方法如下:

首先SecondViewController视图中需要有一个属性用来 存储 传递过来的值:
@property(nonatomic,retain) NSString *firstValue ;//传值用
//重写初始化方法,用于传值

- (id)initWithValue:(NSString *)value{
if(self = [super initWithNibName:nil bundle:nil]) {
self.firstValue = value;
}
return self;
}
方法传值:

- (void)buttonAction:(UIButton *)button{

//将方法传值与初始化写到一起
SecondViewController *second = [[SecondViewController alloc]initWithValue:_txtFiled.text];//此时已经将值存在firstValue中
[self.navigationController pushViewController:second animated:YES];
}
这样就可以直接通过firstValue属性获得传递过来的值:

//显示传过来的值

[_txtFiled setText:_firstValue];//firstValue保存传过来的值
3、协议传值代替协议代理传值,主要时间点问题。
上面 中说明了如何从A传值到B,这次要讲的是如何从A进入B,在B输入值后回传给A,这类似于Android中的利用Activity的onActivityResult回调方法实现两个Activity之间的值传递,那么在IOS中如何实现这个功能呢,答案是使用Delegate(委托协议)。
4、Block传值
1.第一页中 声明一个 block, 需要传入一个颜色 , 让当前的 view 变色
// 声明一个 block, 需要传入一个颜色 , 让当前的 view 变色
void (^changeColor)( UIColor *color) = ^( UIColor *color){
self . view . backgroundColor = color;
};
2 . 第一页中 //block 传值 --------- 将 block 给第二个页面
SecondViewController *secondVC = [[ SecondViewController alloc ] init ];
//block 传值 --------- 将 block 给第二个页面
secondVC. block = changeColor;
3.第二页中定义 -- 当 block 变量作为一个类的属性 , 必须要使用 修饰
//block 传值 --------- 将 block 给第二个页面
//block 传值 --- 当 block 变量作为一个类的属性 , 必须要使用 修饰
@property ( nonatomic , ) void (^block)( UIColor *color);
4.在第二页中给block传值
//block 传值 --------- 将传值给 block
NSArray *array = [ NSArray arrayWithObjects :[ UIColor yellowColor ], [ UIColor cyanColor ], [ UIColor greenColor ], [ UIColor brownColor ], nil ];
self . block ([array objectAtIndex : rand () % 4 ]);
//block语法
//返回值类型 (^block参数名) (参数类型 参数名) = ^返回值类型 (参数类型 参数名) {
//具体实现;
//};
float b = 0;
//1.无参数无返回值

void(^block1)(void) = ^(void){
NSLog(@ "可口可乐" );
};
//block语法调用
block1();
//2.有参数,无返回值
void(^block2)(NSString *str1, NSString *str2) = ^void(NSString *str1, NSString *str2){
NSString *a = [str1 stringByAppendingString:str2];
NSLog(@ "%@" , a);
};
block2(@ "abc" ,@ "def" );
//3.有返回值,无参数
NSString *(^block3)(void) = ^NSString *(void){
return @ "咿呀咿呀呦" ;
};
NSLog(@ "%@" ,block3());
//4.有参数,有返回值
NSString *(^block4)(NSString *str1) =^NSString *(NSString *str1){
return [str1 stringByAppendingString:@ "真棒!!!!" ];
};
NSLog(@ "%@" , block4(@ "苹果电脑" ));
//声明一个block,需要传入一个颜色,让当前的view变色
void(^changeColor)(UIColor *color) = ^(UIColor *color){
self.view.backgroundColor = color;
};
5 单例 传值
单例只会对某个类实例化一次/单例类,对单例这个类实例化一次有且仅有一个对象
你单例初始化,只能初始化一次,然后你指向的对象,其实都是指向一个内存地址,也就是同一块内存,所以都是一样的
那么,只能有一个对象,就是实例化的那个
(1)定义单例类singleton .h文件
#import <Foundation/Foundation.h>
@interface singleton : NSObject //步骤一
//@property (strong,nonatomic) UITextField *value;//最开始的时候把这个value定义为UITextField了,然后在init里面又没有初始化它,就取不到值。任何对象都要初始化它才能使用。
@property (strong, nonatomic) NSString *value;
//+(id)shareData:
+(singleton *)shareData; //步骤二
@end
//.m文件
#import "singleton.h"
@implementation singleton
static singleton *singletonData = nil; //步骤三
+(singleton *)shareData { //步骤四
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
singletonData = [[singleton alloc] init];
});
return singletonData;
}
-(id)init { //步骤五
if (self = [super init]) {
// self.value = [[UITextField alloc]init];
}
return self;
}
@end
//以上是一个完整单例子