VC 之间的数据传递:Objective C
Data Passing between VC : Objective C
我是 objective 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 后,当我打开
"Setting" VC,可以通过使用 viewWillappear 和 UserDefault 来达到目的,如下所示:
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"viewWillAppear");
[super viewWillAppear:animated];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[Switch setOn:[defaults boolForKey:@"EnableLIVE"] animated:YES];
}
案例二:
在这种情况下,我已经在 "Settings" 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];
}
我是 objective 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 后,当我打开
"Setting" VC,可以通过使用 viewWillappear 和 UserDefault 来达到目的,如下所示:
- (void)viewWillAppear:(BOOL)animated
{
NSLog(@"viewWillAppear");
[super viewWillAppear:animated];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[Switch setOn:[defaults boolForKey:@"EnableLIVE"] animated:YES];
}
案例二:
在这种情况下,我已经在 "Settings" 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];
}