我是从事目标C的新手。我面临一个问题。 我有一个包含三个视图控制器的选项卡栏控制器,我只关心其中两个名为“ Setting”和“ BBVC”的VC。 “ BBVC”具有UIButton,“设置”具有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:
在这种情况下,我已经在“ 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的地址为nil。请参见下图
注意:UISwitch是通过编程创建的。
我在这里一无所知。任何帮助都将受到赞赏。 谢谢。
答案 0 :(得分:0)
如果我正确地解释了您的问题,听起来您当前遇到的主要问题是在已经显示的情况下更新设置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];
}