簡體   English   中英

VC之間的數據傳遞:目標C

[英]Data Passing between VC : Objective C

我是從事目標C的新手。我面臨一個問題。 我有一個包含三個視圖控制器的選項卡欄控制器,我只關心其中兩個名為“ Setting”和“ BBVC”的VC。 “ BBVC”具有UIButton,“設置”具有UISwitch(請參見下圖)。 圖片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后,當我使用“ Setting” 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”時,它就會作為彈出窗口加載,如下圖所示。 我正在努力實現我的目標,但沒有成功。

圖片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。 請看下圖

圖片3

注意: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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM