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