Передача данных между VC: Цель C

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

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

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

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

}

Случай 2:

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

изображение 3

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

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

2 ответа

Решение

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

Используйте код ниже:

 @interface VerifyViewController : UIViewController
 @property (nonatomic,strong) NSString *otpStr;
 @property(nonatomic,strong) NSString *mobileStr;

Затем передайте значения:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender

{

  VerifyViewController *loadCtr = (VerifyViewController 
  segue.destinationViewController;
   loadCtr.otpStr = [tmpdict valueForKey:@"otp"];
  loadCtr.mobileStr = _mobiletf.text;

}

Другие вопросы по тегам