美文网首页
iOS页面传值

iOS页面传值

作者: lionsom_lin | 来源:发表于2018-01-25 17:16 被阅读11次

    常用 + 代码

    • 属性传值
    • 方法传值
    • Block
    • Delegate
    • NSNotificationCenter传参
    • NSUserDefaults

    不常用无代码

    • extern
    • 单例

    一、属性传值 - 单向传值

    @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保存传过来的
    

    一、方法传值 - 单向传值

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

    初始化方法如下:

    首先SecondViewController视图中需要有一个属性用来 存储 传递过来的值:

    //重写初始化方法,用于传值
    - (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保存传过来的值
    

    三、Block传值 - 反向传值

    ①在后面控制器的 .h文件 中声明block

    // 一会要传的值为NSString类型
    typedef void (^newBlock)(NSString *);
    
    @interface NewViewController : UIViewController
    // 声明block属性
    @property (nonatomic, copy) newBlock block;
    // 声明block方法
    - (void)text:(newBlock)block;
    
    @end
    

    ②在后面控制器的 .m文件 中设置block

    // 设置block,设置要传的值
    - (void)text:(newBlock)block
    {
        self.block = block;
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:YES];
        if (self.block != nil) {
            self.block(@"呵呵");
        }
    }
    

    ③在前面控制器的 .m文件 中接收传来的值

    #import "ViewController.h"
    #import "NewViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        UIButton *button = [UIButton buttonWithType:(UIButtonTypeRoundedRect)];
        button.frame = CGRectMake(0, 100, 100, 100);
        button.backgroundColor = [UIColor redColor];
        [button addTarget:self action:@selector(push) forControlEvents:(UIControlEventTouchUpInside)];
        [self.view addSubview:button];
    }
    
    - (void)push
    {
        NewViewController *newVC = [[NewViewController alloc] init];
        // 接收block传来的值
        newVC.block = ^(NSString *str){
            NSLog(@"%@", str);
        };
        [self.navigationController pushViewController:newVC animated:YES];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    

    ④最终实现效果:在控制台打印出了"呵呵"
    到此,block完成传值

    四、Delegate传值 - 反向传值

    BViewController.h

    // 新建一个协议,协议的名字一般是由“类名+Delegate”
    @protocol ViewControllerBDelegate <NSObject>
    
    // 代理传值方法
    - (void)sendValue:(NSString *)value;
    
    @end
    
    @interface ViewControllerB : UIViewController
    
    // 委托代理人,代理一般需使用弱引用(weak)
    @property (weak, nonatomic) id<ViewControllerBDelegate> delegate;
    
    @end
    
    

    BViewController.m

    - (IBAction)backAction:(id)sender
    {
        if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果协议响应了sendValue:方法
            [_delegate sendValue:_textField.text]; // 通知执行协议方法
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    AViewController.m

    #import "ViewControllerB.h"
    
    @interface ViewController () <ViewControllerBDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        ViewControllerB *vc = segue.destinationViewController;
        // 设置代理 
        [vc setDelegate:self];  
    }
    
    // 这里实现B控制器的协议方法
    - (void)sendValue:(NSString *)value
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"成功" message:value delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alertView show];
    }
    

    五、NSNotificationCenter传参

    发送方:发送通知,包含发送数据

    [[NSNotificationCenter defaultCenter] postNotificationName:@"getIsOnlineInfo" object:self userInfo:@{@"isOnline":@"yesOnline"}];
    

    接受方:开启监听通知

        [[NSNotificationCenter defaultCenter] addObserver: self
                                                 selector: @selector(getIsOnlineInfo:)
                                                     name: @"getIsOnlineInfo"
                                                   object: nil];
    

    接收方:提取数据

    -(void)getIsOnlineInfo:(NSNotification*)notification
    {
        NSDictionary *nameDictionary = [notification userInfo];
        NSString *isonline = [nameDictionary objectForKey:@"isOnline"];
        
        if ([isonline isEqualToString:@"yesOnline"])
        {
            [self TESTBtn];
        }
        if ([isonline isEqualToString:@"noOnlie"])
        {
            NSLog(@"对方容联云不在线");
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS页面传值

          本文链接:https://www.haomeiwen.com/subject/nbmvaxtx.html