ios - VC之间的数据传递:Objective C
问题描述
我是致力于目标 C 的新手。我面临一个问题。我有包含三个视图控制器的选项卡栏控制器,其中我只关心两个名为 "Setting" 和 "BBVC" 的 VC。“BBVC”有一个 UIButton,“Setting”有一个 UISwitch(请看下图)。
当按下按钮“B”时,在标签栏视图控制器中执行下面的代码:
- (void)centerButtonTapped:(id __unused)sender {
BBVC *vc = [[BBVC alloc] init];
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:nc animated:YES completion:nil];
}
BBVC 被加载为弹出窗口
我的目标是我想根据“UIButton”动作事件改变“UISwitch”的值。
案例 1:未设置视图
在这种情况下,按下 UIButton 后,当我在“设置”VC 上时,可以使用 viewWillappear 和 UserDefault 来实现目标,如下所示:
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"viewWillAppear");
[super viewWillAppear:animated];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[Switch setOn:[defaults boolForKey:@"EnableLIVE"] animated:YES];
}
案例2:
在这种情况下,我已经在“设置”VC(即设置视图已加载)上,当按下选项卡栏中的按钮“B”时,它会作为弹出窗口加载,如下图所示。我正在努力实现我的目标,但它不起作用。
尝试 1:在设置 VC 中,我更新了“viewDidAppear”方法中的代码,但是在调试时我在关闭 BBVC 后才知道,方法“viewDidAppear”没有被调用。
-(void)viewDidDisappear:(BOOL)animated
{
NSLog(@"viewDidDisappear");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[Switch setOn:[defaults boolForKey:@"EnableLIVE"] animated:YES];
}
尝试 2:
使用委托和协议:
我使用了工作正常的委托和协议,但在这种情况下 UISwitch 的地址为零。请看下图
注意: UISwitch 是以编程方式创建的。
我在这里一无所知。任何形式的帮助表示赞赏。谢谢你。
解决方案
如果我正确解释了您的问题,听起来您当前遇到的主要问题是在设置 VC 已经显示时更新实时开关,但 BBVC 以模态方式显示(并且它的按钮被按下)。
您可以在设置控制器加载时在设置控制器中监听用户默认值更改的通知,并在释放后将其作为观察者删除 - 然后在用户默认值更改通知出现时将开关调整为适当的值。这些行:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDefaultsDidChange:) name:NSUserDefaultsDidChangeNotification object:nil];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.liveSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:@"EnableLIVE"]];
}
- (void)userDefaultsDidChange:(NSNotification *)notification {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.liveSwitch setOn:[[notification object] boolForKey:@"EnableLIVE"]];
}];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
推荐阅读
- laravel - Laravel Eloquent:获取对象而不是数组
- angular - 将打印作业直接提供给打印机 angular 6
- angular - 本地通知日期离子
- java - Java Spark 请求的路由 [/users/] 尚未在 Spark 中映射以接受:[*/*]
- microsoft-graph-api - 无法使用 Graph API 创建从 Google 导入的事件
- php - 如何在while循环中运行sql查询
- javascript - 基于javascript中的多个键对数据进行分组
- reactjs - 如何从父组件调用子组件中的事件处理程序或方法?
- appcelerator - 在 xcode 中找不到 ti.main.js 文件。但它在 appcelerator 中运行良好
- here-api - 如何获得道路连接的形状