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

效果如下

相关推荐
The_superstar61 小时前
2026.4.28衡山派学习复习笔记
笔记·学习
XD7429716361 小时前
001. MSP430G2553 入门总述:从零开始学习这颗单片机
单片机·嵌入式硬件·学习·嵌入式·msp430g2553
wuxinyan1231 小时前
大模型学习之路01:提示工程从入门到精通(第一篇)
人工智能·学习·提示词
for_ever_love__1 小时前
UI学习:通知传值
学习·ui·ios·objective-c
周末也要写八哥1 小时前
编程学习中的记=记忆还是记录?
学习
随风,奔跑1 小时前
Git学习笔记
笔记·git·学习
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_1:(全套原生Input+表单结构拆解)
前端·css·ui·html
慕容卡卡2 小时前
Claude 使用神器(web页面)--CloudCLI UI
java·开发语言·前端·人工智能·ui·spring cloud
咬_咬2 小时前
go语言学习(函数)
开发语言·学习·golang