设为首页 加入收藏

TOP

iOS学习——页面的传值方式(三)
2019-08-26 07:01:36 】 浏览:120
Tags:iOS 学习 面的 方式
在方法的实现代码中将参数传递给主页面的属性
//要实现BToADelegate
@interface KLMainViewController () <BToADelegate>

@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.delegate = self; //申明子页面的代理是主页面自身self
    [self.navigationController pushViewController:subVC animated:YES];
}

#pragma mark BToADelegate 代理方法,子页面调用的时候会回调该方法
- (void)transferString:(NSString *)string {
    self.textField.text = string;
}

@end

 2.3 Block传值

方法描述:在子页面中添加一个块语句属性,在子页面返回主页面之前调用该块语句。在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)。这样,在子页面返回主页面时就会调用该回调函数来传递数据。

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

传递方式:反向传递。

使用步骤:整个步骤和代理差不多

  1. 在子页面中添加一个块语句属性
    //定义block的类型
    typedef void (^TransDataBlock)(NSString *content);
    
    @interface KLSubViewController : UIViewController
    
    @property (strong, nonatomic) UITextField *textField;
    @property (strong, nonatomic) UIButton *button;
    
    @property (copy, nonatomic) TransDataBlock transDataBlock;//定义一个block属性,用于回传数据
    
    @end
  2. 在子页面返回主页面之前调用该块语句
    #import "KLSubViewController.h"
    
    @interface KLSubViewController ()
    
    @end
    
    @implementation KLSubViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        self.title = @"子界面";
        
        //布局代码省略
        ......
    }
    
    - (void) btnClicked:(UIButton *)btn {
        //如果回传block存在 则调用该block进行回传数据
        if (self.transDataBlock) {
            self.transDataBlock(@"子页面回传的数据");
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    @end
  3. 在主页面跳转子页面之前,设置子页面中的块语句属性将要执行的动作(回调函数)
    #import "KLMainViewController.h"
    #import "KLSubViewController.h"
    
    @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];
        //通过子页面的block回传拿到数据后进行处理,赋值给当前页面的textfield
        subVC.transDataBlock = ^(NSString *content) {
            self.textField.text = content;
        };
        [self.navigationController pushViewController:subVC animated:YES];
    }
    
    @end 

2.4 通知传值

方法描述:在通知接收方需要注册通知,并指定接收到通知后进行的操作;而在通知发送方则在需要传递数据时发送通知就OK了。通知的操作都是通过NSNotificationCenter来完成的。

但是要注意的两点是:

  • 要想能够接收到通知进行处理,必须先注册通知。
  • 在注册通知的页面消毁时一定要移除已经注册的通知,否则会造成内存泄漏
  • 注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知

适用场景

  • 一般用于已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用通知反向传值。
  • 但是也可以用于通过push进入子页面时向子页面传递数据,这时就可以用通知进行正向传值。

传递方式:正向传递(很少这样用)、反向传递(更常用)。

使用步骤

  • 反向传递:
  1. 在子页面返回的时候发送通知,注册的接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
    @interface KLSubViewController ()
    
    @end
    
    @implementation KLSubViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.
首页 上一页 1 2 3 4 5 6 下一页 尾页 3/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇IOS马甲包(诚招大量开发) 下一篇block本质探寻六之修改变量

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目