Передача данных между VC: Цель C - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок, работающий над задачей C. У меня одна проблема.У меня есть контроллер панели вкладок, содержащий три контроллера представления, из которых я обеспокоен только двумя VC, названными "Setting" и "BBVC".«BBVC» имеет кнопку UIB, а «Setting» - переключатель UIS (см. Изображение ниже).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 загружается как всплывающее окно UP

Моя цель - я хочу изменить значение «UISwitch» на основе события действия «UIButton».

Случай 1: Не включено Настройка View
В этом случае после нажатия кнопки UIB, когда я нахожусь на «Настройка» ВК, цель может быть достигнута с помощью viewWillappear и UserDefault, как показано ниже:

- (void)viewWillAppear:(BOOL)animated
{
    NSLog(@"viewWillAppear");
    [super viewWillAppear:animated];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [Switch setOn:[defaults boolForKey:@"EnableLIVE"] animated:YES];

}

Случай 2:

В этом случае я уже на ВК «Настройки» (т. Е. Представление настроек уже загружено), и когда нажимается кнопка «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 равен нулю.См. Изображение ниже

image 3

Примечание: UISwitch создается программно.

Я ничего не понимаю здесь.Любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Если я правильно интерпретирую ваш вопрос, похоже, что основная проблема, с которой вы сталкиваетесь в настоящее время, - это обновление переключателя в реальном времени на настройках 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

...