设为首页 加入收藏

TOP

iOS学习——页面的传值方式(二)
2019-08-26 07:01:36 】 浏览:124
Tags:iOS 学习 面的 方式
traintMaker *make) { 39 make.center.mas_equalTo(weakSelf.view).mas_offset(0.0f); 40 make.left.mas_equalTo(weakSelf.view).mas_offset(15.0f); 41 make.right.mas_equalTo(weakSelf.view).mas_offset(-15.0f); 42 }]; 43 44 _button = [UIButton buttonWithType:UIButtonTypeCustom]; 45 [_button setTitle:@"返回主界面" forState:UIControlStateNormal]; 46 [_button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; 47 [_button addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside]; 48 [self.view addSubview:_button]; 49 [_button mas_makeConstraints:^(MASConstraintMaker *make) { 50 make.centerX.mas_equalTo(weakSelf.view).mas_offset(0.0f); 51 make.top.mas_equalTo(weakSelf.textField.mas_bottom).mas_offset(40.0f); 52 }]; 53 } 54 55 - (void) btnClicked:(UIButton *)btn { 56 57 [self.navigationController popViewControllerAnimated:YES]; 58 } 59 60 @end KLSubViewController

2.1 属性传值

方法描述:在从当前页面跳转到下主页面之前,提前创建下主页面,通过赋值的方式将当前页面的数据赋予下主页面的属性。

适用场景:当从主页面push到子页面时,子页面需要使用到主页面的数据,我们需要使用到正向传值。

传递方式:正向传值。

使用步骤

  1. 子页面的.h文件中定义属性来保留要传递过来的数据
    //子页面KLSubViewController.h的属性定义
    @interface KLSubViewController : UIViewController
    
    @property (strong, nonatomic) UITextField *textField;
    @property (strong, nonatomic) UIButton *button;
    
    @property (strong, nonatomic) NSString *content;//属性接收数据
    
    @end
  2. 主页面在跳转的时候将数据赋值给子页面对应的属性 
    //主界面跳转时将数据赋值给对应的属性
    @interface KLMainViewController ()
    
    @property (strong, nonatomic) UITextField *textField;
    @property (strong, nonatomic) UIButton *button;
    
    @end
    
    @implementation KLMainViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.title = @"主界面";
        
        //布局代码省略
        ......   
    }
    
    //跳转
    - (void) btnClicked:(UIButton *)btn {
        KLSubViewController *subVC = [[KLSubViewController alloc] init];
        subVC.content = @"来自主界面的数据";
    //    subVC.textField.text = @"来自主界面的数据"; //这样传递是有问题的,因为子页面中的textfield是在viewDidLoad中进行初始化和布局的,在这时候textfield还没有初始化,为nil,所以赋值是失效的
        [self.navigationController pushViewController:subVC animated:YES];
    }
    
    @end

2.2 代理传值

方法描述:首先在子页面的头文件中添加一个代理(协议)的定义,定义一个传递数据的方法,并且在子页面的类中添加一个代理属性;然后,在子页面返回主页面之前调用代理中定义的数据传递方法(方法参数就是要传递的数据);最后,在主页面中遵从该代理,并实现代理中定义的方法,在方法的实现代码中将参数传递给主页面的属性。

适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。

传递方式:反向传值。

使用步骤

  1. 在子页面中添加一个代理协议,在协议中定义一个传递数据的方法
  2. 在子页面.h文件中添加一个代理属性
    //子页面的.h文件,定义代理以及代理属性
    // 声明代理
    @protocol BToADelegate <NSObject>
    // 代理方法
    - (void)transferString:(NSString *)string;
    @end
    
    @interface KLSubViewController : UIViewController
    
    @property (strong, nonatomic) UITextField *textField;
    @property (strong, nonatomic) UIButton *button;
    
    @property (nonatomic, weak) id<BToADelegate> delegate;//代理属性
    
    @end
  3. 在子页面返回主页面之前掉好用代理中定义数据传递方法,方法参数就是要传递的数据
    //子页面返回时调用代理方法
    - (void) btnClicked:(UIButton *)btn {
        //如果当前的代理存在,并且实现了代理方法,则调用代理方法进行传递数据
        if (self.delegate &&
            [self.delegate respondsToSelector:@selector(transferString:)]) {
            [self.delegate transferString:@"子页面回传的数据"];
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
  4. 在主页面中遵从该代理,并实现代理中定义的方法,
首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇IOS马甲包(诚招大量开发) 下一篇block本质探寻六之修改变量

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目