UI学习:单例传值

文章目录

单例传值

什么是单例

单例 = 全局唯一的对象,任何地方都能访问它

举例讲解

VCSecond 有一个 TextField,输入文字后通过通知传给 VCFirst 的 Label 显示

创建单例类, 设置要共享的数据

objc 复制代码
// DataManager.h  

@interface DataManager : UIViewController
// 获取单例的方法
- (instancetype) shareManager;

// 要共享的数据
@property (nonatomic, copy) NSString* shareText;
@end

实现单例, 保证每次创建出的DataManager对象都唯一

objc 复制代码
// DataManager.m

// 实现单例
+ (instancetype)shareManager {
    static DataManager *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[super allocWithZone: NULL] init];
    });
    return instance;
}

+ (instancetype) allocWithZone: (struct _NSZone*) zone {
    return [self shareManager];
}

- (id) copyWithZone: (NSZone*) zone {
    return self;
}

- (id) mutableCopy: (NSZone*) zone {
    return self;
}

定义VCFirst 的showLabel属性 , 显示接收到的值

objc 复制代码
#import <UIKit/UIKit.h>
#import "VCSecond.h"
#import "DataManager.h"     // 引入单例

@interface VCFirst : UIViewController
@property (nonatomic) UILabel* showLabel;
@end

创建label, button,显示传值的内容, 并通过事件调用切换视图控制器

objc 复制代码
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"VCFirst";
    
    // 创建显示 Label
    self.showLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 250, 300, 50)];
    self.showLabel.textAlignment = NSTextAlignmentCenter;
    self.showLabel.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview: self.showLabel];
    
    // 创建跳转按钮
    UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithTitle: @"next" style: UIBarButtonItemStylePlain target: self action: @selector(pushToSecond)];
    self.navigationItem.rightBarButtonItem = item;
}

每次都从单例中读取数据,因为实现了单例, 所以每次创建的 DataManager 对象都唯一, 因此DataManager 对象可以作为媒介在不同的视图控制器间传递数据

objc 复制代码
// VCFirst.m  

// 从单例中读取数据
    NSString* saveText = [DataManager shareManager].shareText;
    if (saveText.length > 0) {
        self.showLabel.text = [NSString stringWithFormat: @"上次保存: %@", saveText];
    } else {
        self.showLabel.text = @"等待接收文字...";
    }

设置按钮事件, 创建VCSecond视图并跳转

objc 复制代码
// VCFirst.m  

- (void) pushToSecond {
    VCSecond* vc = [[VCSecond alloc] init];
    [self.navigationController pushViewController: vc animated: YES];
}

通过viewWillAppear: (BOOL)animate方法在每次加载到VCFirst的时候都更新数据

objc 复制代码
// VCFirst.m  

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear: animated];
    
    // 每次回到这个界面时, 重新读取单例中的最新数据
    NSString* latesText = [DataManager shareManager].shareText;
    if (latesText.length > 0) {
        self.showLabel.text = [NSString stringWithFormat: @"上次保存: %@", latesText];
    }
}

在VCSsecond中定义并创建 UITextField 类型属性 inputTextField, 用于输入需要传值的内容

objc 复制代码
// VCSecond.m 

@interface VCSecond ()
@property (nonatomic, strong) UITextField *inputTextField;
@property (nonatomic, strong) UIButton *sendButton;
@end  
    
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"VCSecond";
    
    // 创建输入框
    self.inputTextField = [[UITextField alloc] initWithFrame:CGRectMake(50, 250, 275, 44)];
    self.inputTextField.borderStyle = UITextBorderStyleRoundedRect;
    self.inputTextField.placeholder = @"请输入文字";
    [self.view addSubview:self.inputTextField];
        
    // 创建发送按钮
    UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithTitle: @"back" style: UIBarButtonItemStylePlain target: self action: @selector(pressSave)];
    self.navigationItem.rightBarButtonItem = item;
}

设置按钮事件, 返回 VCFirst 并将 VCSecond 中inputTextField 的text值保存到单例中, 用于VCFirst 中通过单例接受传递的值

objc 复制代码
// VCSecond.m

- (void) pressSave {
    NSString* inputText = self.inputTextField.text;
    if (inputText.length == 0) {
        inputText = @"空消息";
    }
    
    // 把数据存入单例
    [DataManager shareManager].shareText = inputText;
    
    NSLog(@"已保存到单例: %@", inputText);
    
    // 返回
    [self.navigationController popViewControllerAnimated: YES];
}

效果如下

相关推荐
console.log('npc')21 小时前
FigmaEX 汉化,免费使用,下载与安装指南(Windows/Mac)
windows·macos·ui·figma
70asunflower21 小时前
【Day1-2】部署&运行 Gemma4 大模型 - Datawhale AI学习
人工智能·学习·datawhale·amdev
风兮雨露21 小时前
Photoshop CS6 安装教程(附绿色安装包)
ui·photoshop
库奇噜啦呼21 小时前
【iOS】源码学习-锁的原理
学习·ios·cocoa
_李小白21 小时前
【android opencv学习笔记】Day 33: 直线检测之图像轮廓检测
android·opencv·学习
AI_零食21 小时前
HarmonyOS 表单验证机制深度解析与实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
云草桑21 小时前
.NET10+AI 架构师全套实战学习文档(含源码、案例、面试题、项目源码)
人工智能·学习·ai·.net
暗夜猎手-大魔王1 天前
hermes源码学习5-Provider 运行时解析
大数据·人工智能·学习
-To be number.wan1 天前
计算机组成原理 | 指令寻址
学习·计算机组成原理
Niuguangshuo1 天前
LangChain 学习之旅(二):用 LCEL 与解析器构建标准流水线
学习·langchain·unix