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];
}

效果如下

相关推荐
科技大视界17 分钟前
大学生专业课笔记本用哪款?来酷Air14酷睿版14英寸轻薄笔记本电脑适合学习任务多的人
学习
weixin_4235339938 分钟前
c++类的继承学习-去中心化交易所(DEX)的“流动性池初始化与交易指令”设计
c++·学习·去中心化
远离UE41 小时前
UE5 各类型灯光学习
学习·ue5
New农民工1 小时前
射频芯片学习-dBm概念
学习·射频学习
唐诺2 小时前
Objective-C 之 Category 详解
objective-c·category
十月的皮皮4 小时前
C语言学习笔记20260703-牛牛与后缀表达式(逆波兰表达式)
c语言·笔记·学习
EricStone2 天前
VibeCoding工程流程学习二:iOS项目架构
ios·vibecoding
天桥吴彦祖4 天前
判断iOS如何监听手机屏幕是否锁屏
ios
敲代码的鱼5 天前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
时光足迹5 天前
uni-app 视频通话实战:康复师与患者视频问诊的 6 个致命 Bug 与解决方案
android·ios·uni-app