【问题标题】:Data Passing between VC : Objective CVC之间的数据传递:Objective C
【发布时间】:2019-04-28 13:21:26
【问题描述】:

我是致力于目标 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 是以编程方式创建的。

我在这里一无所知。任何形式的帮助表示赞赏。 谢谢。

【问题讨论】:

  • 你用的是笔尖还是故事板?
  • @HichemRomdhane 嘿,故事板。但是所有其他元素,如 UIButton 和 UISwitch 都是以编程方式创建的。

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


【解决方案1】:

如果我正确解释了您的问题,听起来您当前遇到的主要问题是在设置 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

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多