• 【iOS开发】-通知传值


    通知传值

    • 通知传值也是逆向传值的一种,即第二界面向第一界面传值
      谁要监听值的变化,谁就注册通知, 特别要注意**,通知的接受者必须存在这一条件**
      • 1.注册通知
      • 2.通知中心发送通知消息,其中name(通知名)前后要保持一致性
      • 3.实现通知内部的方法,并实现传值
      • 4.消息发送完之后,要移除通知

    通知传值案例

    请添加图片描述

    • 在第二个界面存在一个按钮,点击按钮把我们需要传入的值传给第一界面并显示在第一界面的label上即可完成传值

    secondViewController

    • secondViewController.h
      • 字符串String的内容传给字典(通知传值仅限于字典类型和Object),这里仅介绍字典类
    @interface secondViewController : UIViewController
    // 需要传过去的字符串
    @property (nonatomic, strong)NSString *string;
    @property (nonatomic, strong)NSMutableDictionary* dictionary;
    // 点击按钮跳转到第一界面
    @property (nonatomic, strong)UIButton* button;
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • secondViewController.m
      • 在ViewDidLoad完成字典,按钮的初始化
    #import "secondViewController.h"
    
    @interface secondViewController ()
    
    @end
    
    @implementation secondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        _string = [NSString stringWithFormat:@"Secon界面传过来的字符串"];
        _button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [_button setTitle:@"到界面一" forState:UIControlStateNormal];
        [_button addTarget:self action:@selector(pressButton) forControlEvents:UIControlEventTouchUpInside];
        _button.frame = CGRectMake(100, 200, 100, 40);
        [self.view addSubview:_button];
        _dictionary = [[NSMutableDictionary alloc] init];
        [_dictionary setObject:_string forKey:@"key1"];
        self.view.backgroundColor = [UIColor orangeColor];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
      • 在🔘按钮的点击事件里面注册通知并发送通知

    注册通知

      • [[NSNotificationCenter defaultCenter] postNotificationName:@"inform" object:nil userInfo:_dictionary];
        • postNotificationName:之后的参数就是这个通知的名字,要和要和接收者中的名字一样,才能让接收者正确接收。
        • object:接收对象
        • userInfo: 携带的参数,为字典类型的数据,在例子中我携带了一个字典,因为有时候我们要传递的参数不只是一个,所以把东西全部放在通知里面,在接收者中,根据字典里面的键来取出里面的值。
        • _dictionary是我之前定义的一个字典实例。
    - (void)pressButton {
        // 发送通知并回传数据
        // 注册通知
        [[NSNotificationCenter defaultCenter] postNotificationName:@"inform" object:nil userInfo:_dictionary];
        [self dismissViewControllerAnimated:YES completion:nil];
        
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ViewController

    • ViewController.h
      • Button 点击跳转到第二界面
      • label 接受到通知传值的string并显示在label上
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    @property (nonatomic, strong)UIButton * button;
    @property (nonatomic, strong)UILabel* label;
    
    @end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • ViewController.m
      • 在ViewDidload里面完成基本设置,和发送通界面不同的是需要在这里注册观察者用来接受通知发送者传来的数据

    注册观察者

    • 注册通知,用于接收通知,接收通知的名称必须和发送通知的名称保持一致才能接收到,否则无法接收到发出的通知
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiReceived:) name:@"TransDataNoti" object:nil];
    
    • 1
    • 注:务必让接收者中name后面的参数和发送者中的name后面的参数一样。
    #import "ViewController.h"
    #import "secondViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        _label = [[UILabel alloc] initWithFrame:CGRectMake(100, 200, 250, 40)];
        [self.view addSubview:_label];
        
        _button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [_button setTitle:@"到界面2" forState:UIControlStateNormal];
        _button.frame = CGRectMake(100, 300,  100, 40);
        [_button addTarget:self action:@selector(pressButton) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:_button];
        
        // 注册观察者,用于接受界面二的通知,接收通知的名称必须和发送通知的名称保持一致才能收到
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(receiveNoticed:) name:@"inform" object:nil];
        
    }
    - (void)pressButton {
        secondViewController* secondView = [[secondViewController alloc] init];
        
        [self presentViewController:secondView animated:YES completion:nil];
    }
    
    • 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

    接受通知函数

    // 观察者接受函数,
    // 这里接受传值并赋值给当前页面的label
    - (void)receiveNoticed:(NSNotification*)sender {
        _label.text = sender.userInfo[@"key1"];
    }
    
    // 移除通知
    - (void)dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    效果请添加图片描述

    请添加图片描述
    请添加图片描述

    总结

    通知传值 Block传值 协议传值这三个传值都倾向于逆向传值的应用
    后续还会学习并更新内容

  • 相关阅读:
    代码随想录算法训练营第十二天|今天的回溯味儿有点冲
    面试官:Redis中字符串的内部实现方式是什么?
    数学建模笔记-第三讲-插值
    授人以渔 选购篇九:扫地机器人(扫拖机器人)选购要点
    详解FreeRTOS:FreeRTOS任务创建过程源码分析(进阶篇—1)
    [附源码]SSM计算机毕业设计民宿客栈管理系统JAVA
    一致性hash的奥妙
    MySQL的事务和存储引擎
    处理异步请求的 async/await 和 promise
    JavaScript LocalStorage 完整指南
  • 原文地址:https://blog.csdn.net/weixin_61639290/article/details/126134878