美文网首页
iOS-ViewController之间的传值

iOS-ViewController之间的传值

作者: weyan | 来源:发表于2018-01-30 16:18 被阅读0次

    一、控制器之间的正向传值:
    1、属性传值
    1.1、通过storyboard创建控制器
    //Segue
    定义:Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象
    属性:

    //Segue ID
    NSString *identifier; 
    //来源控制器
    UIViewController *sourceViewController;   
    //目标控制器
    UIViewController *destinationViewController;
    

    类型:
    (1)Show
    根据当前屏幕中的内容,在master area或者detail area中展示内容。
    例如:如果app当前同时显示master和detail视图,内容将会压入detail区域。
    如果app当前仅显示master或者detail视图,内容则压入当前视图控制器堆栈中的顶层视图。
    (2)Show Detail
    在detail area中展现内容。
    例如:即使app同时显示master和detail视图,那么内容将被压入detail区域
    如果app当前仅显示Master或者detail视图,那么内容将替换当前视图控制器堆栈中的顶层视图。
    (3)Present Modally
    使用模态展示内容。属性面板中提供presentation style (UIModalPresentationStyle)与 transition style (UIModalTransitionStyle)两种选项
    (4)Present as Popover
    在某个现有视图中的锚点处使用弹出框展示内容。这个选项可指定显示在弹出框视图一边上的箭头可用方向,同时也是指定锚点视图的一个选项。
    (翻译来自网友)


    image.png
    image.png

    1.2、通过代码创建控制器
    首先创建控制器AViewController和BViewController,点击控制器A中的button跳转到B控制器传值
    ,B控制器有个name属性,在跳转的方法里传值

    -(void)btnClick{
    BViewController *BVC = [[BViewController alloc] init];
    BVC.name = @"要传的值";
    [self.navigationController pushViewController:BVC animated:YES ];
    }
    

    2、通知
    2.1.在A控制器发送通知

    //需要传的参数
    NSDictionary *dict = @{@"key":value};
    //发送通知
    [[NSNotificationCenter defaultCenter]postNotificationName:@"sendDataToTwoVc" object:nil userInfo:dict];
    

    2.2、在B控制器监听通知

    //监听通知(通知名字一定要写正确)
     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(setData:) name:@"sendDataToTwoVc" object:nil];
    //监听通知后调用
    -(void)setData:(NSNotification *)notification{
         NSLog(@"dict - %@",notification.userInfo);
    }
    //移除需要观察的通知
    -(void)dealloc{
        [[NSNotificationCenter defaultCenter]removeObserver:self];
    }
    //注意:如果发送的通知指定了object对象,那么观察者接收的通知设置的object对象与其一样,才会接收到通知,但是接收通知如果将这个参数设置为了nil,则会接收一切通知。
    

    3、NSUserDefault

    //设置需要保存的对象
    [[NSUserDefaults standardUserDefaults] setObject:@"value" forKey:@"key"];
    //同步磁盘
    [[NSUserDefaults standardUserDefaults] synchronize];
    //获取保存的对象
    [[NSUserDefaults standardUserDefaults]objectForKey:@"key"];
    

    二、控制器之间的逆向传值:
    1、block
    有两个控制器分别是AViewController和BViewController,点击A控制器中的按钮跳转到B控制器,点击B控制器的屏幕回到A控制器,并把B控制器textField.text传到A控制器中,改变A控制器中btn的title.

    //A控制器.m文件
    #import "AViewController.h"
    #import "BViewController.h"
    
    @implementation AViewController
    //button的点击事件
    - (IBAction)clickDown:(id)sender {
        BViewController *vc = [[BViewController alloc] init];
        vc.backBlock = ^(NSString *titleStr) {
                [self.btn setTitle:titleStr forState:UIControlStateNormal];
            };
        [self.navigationController pushViewController:vc animated:YES];
    }
    
    //B控制器.h文件
    #import <UIKit/UIKit.h>
    
    @interface BViewController : UIViewController
    @property(nonatomic,copy)void(^backBlock)(NSString *titleStr);
    @end
    
    //B控制器.m文件
    #import "BViewController.h"
    
    @interface BViewController ()
    @property (weak, nonatomic) IBOutlet UITextField *textField;
    @end
    
    @implementation BViewController
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        self.backBlock(self.textField.text);
    }
    

    2、代理
    在B控制器中指定协议,让A控制器遵守协议设置A控制器为代理并实现协议中的方法

    A控制器.m文件
    #import "AViewController.h"
    #import "BViewController.h"
    
    @interface AViewController ()<BViewControllerDelegate>
    
    @end
    
    @implementation AViewController
    
    - (IBAction)clickDown:(id)sender {
    //在使用block和代理时注意循环引用问题,当一个对象持有block,而该block又持有该对象时,类似下面的伪代码会照成循环引用,__weak typeof(self) weakself=self;
        __weak typeof(self) weakSelf = self;
        BViewController *vc = [[BViewController alloc] init];
        vc.delegate = weakSelf;
        [self.navigationController pushViewController:vc animated:YES];
    }
    //协议中的方法:
    -(void)sendString:(NSString *)str{
    //B控制器传过来的值str
        [self.btn setTitle:str forState:UIControlStateNormal];
    }
    
    //A控制器.h文件
    #import <UIKit/UIKit.h>
    
    @protocol BViewControllerDelegate <NSObject>
    -(void)sendString:(NSString *)str;
    @end
    @interface BViewController : UIViewController
    @property(weak,nonatomic)id<BViewControllerDelegate>delegate;
    @end
    
    //A控制器.m文件
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        [self.delegate sendString:self.textField.text];
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    相关文章

      网友评论

          本文标题:iOS-ViewController之间的传值

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