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

https://developer.apple.com/documentation/foundation/nsuserdefaultsdidchangenotification?language=objc