工作记录8:iOS 传值问题总结(7种传值完美介绍)

本文总结了iOS中7种常见的传值方式:属性传值、初始化传值、协议(委托)传值、Block传值、单例传值、数据共享以及通知中心。详细介绍了每种方法的实现步骤和应用场景,例如使用属性直接赋值、通过协议实现双向通信、利用Block进行回调等,旨在帮助开发者更好地理解和运用这些传值技术。
摘要由CSDN通过智能技术生成

镔哥哥总结传值有以下:

1、属性传值

      前向后传值。

记住:

/*

 1:属性传值第一步需要用到什么类型就定义什么样的属性

 2:从上一个页面到一个页面的选中方法里面将要传的值传到来(上一个页面)备注:这种方法只适用于上一个页面推到下一个页面

 */

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(委托协议)。

工程结构如下:

1346122481_1896.png 

其中有两个ViewController分别对应两个界面,一个协议PassValueDelegate用来实现传值协议,UserEntity是传递数据的对象。
以下是实现的效果:点击Open进入Second界面,输入完毕点击OK后回到First界面并显示结果

1346122704_8626.png 1346122709_1735.png 



1346122728_4358.png 

协议中声明的方法:

  1. #import <Foundation/Foundation.h>  
  2. @class UserEntity;  
  3.   
  4. @protocol PassValueDelegate <NSObject>  
  5.   
  6. -(void)passValue:(UserEntity *)value;  
  7.   
  8. @end  
  9. 在第一个窗口实现协议:
  1. #import <UIKit/UIKit.h>  
  2. #import "PassValueDelegate.h"  
  3.   
  4. //第一个窗口遵守PassValueDelegate  
  5. @interface ViewController : UIViewController<PassValueDelegate>  
  6.   
  7. @property (retain, nonatomic) IBOutlet UILabel *nameLabel;  
  8. @property (retain, nonatomic) IBOutlet UILabel *ageLabel;  
  9. @property (retain, nonatomic) IBOutlet UILabel *gendarLabel;  
  10.   
  11. - (IBAction)openBtnClicked:(id)sender;  
  12.   
  13. @end  

.m文件中实现协议的方法:

[cpp]  view plain copy
  1. //实现协议,在第一个窗口显示在第二个窗口输入的值方法  
  2. -(void)passValue:(UserEntity *)value  
  3. {  
  4.     self.nameLabel.text = value.userName;  
  5.     self.ageLabel.text = [NSString stringWithFormat:@"%d",value.age];  
  6.     self.gendarLabel.text = value.gendar;  
  7. }  

点击Open按钮所触发的事件:

[cpp]  view plain copy
  1. //点击进入第二个窗口的方法  
  2. - (IBAction)openBtnClicked:(id)sender {  
  3.     SecondViewController *secondView = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:[NSBundle mainBundle]];  
  4.     //设置第二个窗口中的delegate为第一个窗口的self  
  5.     secondView.delegate = self;  
  6.       
  7.     [self.navigationController pushViewController:secondView animated:YES];  
  8. }  

第二个窗口中声明一个NSObject对象,该对象遵守PassValueDelegate协议:

[cpp]  view plain copy
  1. #import <UIKit/UIKit.h>  
  2. #import "PassValueDelegate.h"  
  3.   
  4. @interface SecondViewController : UIViewController  
  5.   
  6. @property (retain, nonatomic) IBOutlet UITextField *nameTextField;  
  7. @property (retain, nonatomic) IBOutlet UITextField *ageTextFiled;  
  8. @property (retain, nonatomic) IBOutlet UITextField *gendarTextField;  
  9.   
  10. //这里用assign而不用retain是为了防止引起循环引用。  
  11. @property(nonatomic,assign) NSObject<PassValueDelegate> *delegate;  
  12.   
  13. - (IBAction)okBtnClicked:(id)sender;  
  14. - (IBAction)closeKeyboard:(id)sender;  
  15.   
  16. @end  

输入完毕后,点击OK按钮所触发的事件:

[cpp]  view plain copy
  1. - (IBAction)okBtnClicked:(id)sender {  
  2.     UserEntity *userEntity = [[UserEntity alloc] init];  
  3.     userEntity.userName = self.nameTextField.text;  
  4.     userEntity.gendar = self.gendarTextField.text;  
  5.     userEntity.age = [self.ageTextFiled.text intValue];  
  6.       
  7.     //通过委托协议传值  
  8.     [self.delegate passValue:userEntity];  
  9.     //退回到第一个窗口  
  10.     [self.navigationController popViewControllerAnimated:YES];  
  11.       
  12.     [userEntity release];  
  13. }  

以上就实现了使用Delegate在两个ViewController之间传值,这种场景一般应用在进入子界面输入信息,完后要把输入的信息回传给前一个界面的情况,比如修改用户个人信息,点击修改进入修改界面,修改完后到显示界面显示修改后的结果。

4、Block传值                                               //参考http://liuyafang.blog.51cto.com/8837978/1551399

1.第一页中声明一个block,需要传入一个颜色,让当前的view变色

//声明一个block,需要传入一个颜色,让当前的view变色

    void(^changeColor)(UIColor *color) = ^(UIColor *color){

        self.view.backgroundColor = color;

    };

2. 第一页中//block传值---------block给第二个页面

SecondViewController *secondVC = [[SecondViewController allocinit];

    //block传值---------block给第二个页面

    secondVC.block = changeColor;

3.第二页中定义--block变量作为一个类的属性,必须要使用copy修饰

//block传值---------block给第二个页面

//block传值 ---block变量作为一个类的属性,必须要使用copy修饰

@property (nonatomic , copy)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]);



类和文件

AppDelegate.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#import "AppDelegate.h"
#import "MainViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值