VC之间的数据传递:目标C

时间:2018-11-26 20:52:15

标签: ios objective-c delegates protocols ios-lifecycle

我是从事目标C的新手。我面临一个问题。 我有一个包含三个视图控制器的选项卡栏控制器,我只关心其中两个名为“ Setting”和“ BBVC”的VC。 “ BBVC”具有UIButton,“设置”具有UISwitch(请参见下图)。 Image 1

当按下按钮“ 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”时,它就会作为弹出窗口加载,如下图所示。我正在努力实现自己的目标,但没有成功。

Image 2

尝试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。请参见下图

image 3

注意:UISwitch是通过编程创建的。

我在这里一无所知。任何帮助都将受到赞赏。 谢谢。

1 个答案:

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

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