页面之间的传值
从前往后传值
1.当需要传值时先为后一个界面property一个属性,用这个属性接收传值
2.把需要传的值传给新界面的属性
3.新界面viewDidLoad之后,把传过来的值显示在输入框上
从后往前传值
1.从后面的界面property一个上个界面类型的指针,用于指向上一个界面,这样就能够找到上一个界面
2.把第二个界面的指针指向第一个界面
3.把需要传的值,通过指向上个界面的指针传给上界面.这里可以调方法传值也可以在前一个界面property一个属性用来接收传值(在前一个界面viewWillAppear的方法里 将传过来的值显示在输入框上)
调方法传值如下:
在前一个界面中写一个有参数的方法
- (void)sendName:(NSString *)name{}
在后一个界面中调用这个方法并传值
[self.previousVC sendName:_nameField.text];
当一个后一个界面不仅仅只要给一个固定界面传值时 这里property的指向上一个界面的指针就不能再写死了,所以这里可以property一个id类型的指针指向所有需要传值的界面 还依照从后往前的顺序进行传值但是我们在调方法传值的过程中需要传值的界面的方法不同,我们要调的方法也就不同了,为了方便传值我们此时引入了协议 在协议中定义一个有参数的方法,让需要传值的界面都遵守这个协议,并用协议中定义的方法进行传值(那么第一步property的id类型的指针也要加上协议限制)例如:@property (nonatomic,assign)id<SecondVCDelegate> delegate;
比协议更强大的还有通知:
通知和代理的区别,相同之处都可以实现传值都可以实现方法回调 不同之处是代理只能一对一而通知可以一对多(多对多)传值调用 但是代理不仅可以传值还可以把值传回去(回传,双向传值),丛而实现数据源方法,但是通知的传值是单向的
一个界面可以发生多个通知
//单例类 整个App中只有一个
//通知中心 是单例类 单例方法叫做defaultCenter
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//发送一个通知 object 通知的发送者
//第一个参数是通知的名字 第二个参数是通知的发送者(一般是self) 第三个参数是通知的参数, 用于通知传参
[center postNotificationName:@"changeColor" object:self userInfo:@{@"color":color}];
其他界面可以在viewDidload方法中监听这个通知
//通知不会自动接收,必须主动去监听
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//增加监听者(让某个对象监听通知) 第一个参数是要添加的对象 第二个参数是受到通知时调用的方法 第三个参数是要监听的通知的名字( 监听changColor的通知 nil是监听所有通知)第四个参数object限定通知来源(只接受某个对象法的通知,如果不限写nil)
[center addObserver:self selector:@selector(receiveChangeColor:) name:@"changeColor" object:nil];