2012-12-30 2 views
1

В моем приложении iPhone есть два UIViewControllers; оба встроены в UITabBarController. Однако, когда TabBarController подключен, и коммутатор VC, VC на экране загружает данные в NSUserDefaults, а затем VC, на который переключается, извлекает эти данные из NSUserDefaults.Как передать информацию между двумя UIViewControllers в a в UITabBarController

В настоящее время я загружаю данные в viewWillDisappear из первого VC, а затем извлекает его в viewWillAppear второго VC. проблема заключается в том, что viewWillAppear из VC, который вот-вот появится на экране, вызывается перед представлениемWillDisappear из «старого» VC, поэтому он пытается получить данные, которые еще не загружены.

Что я могу использовать, так что «старый VC» является первым, кто узнает, когда он собирается покинуть экран, чтобы он мог загружать данные до того, как новый выберет эти данные?

* Я также попытался настроить UITabBArControllerDelegate, чтобы старый VC получил - tabBarController: didSelectViewController: но это вызвано слишком поздно.

ответ

4

Если вы не собираетесь передавать много информации, вы можете использовать переменные по умолчанию в качестве одного из множества доступных вариантов. Это может быть не самое лучшее, но это сработает.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:Variable forKey:@"variable"]; 
    [defaults synchronize]; 

Чтобы задать переменные

и

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *fetchVariable = [defaults objectForKey:@"variable"]; 

, чтобы получить его в другом VC.

+0

Да, я получил эту часть, проблема заключалась в том, чтобы загрузить переменную, чтобы она произошла до следующего vc-загрузки. –

+1

Извините, я неправильно понял вопрос! – Naux

+0

Этот ответ помог мне. Я пытался сделать что-то подобное на прошлый день. Большое спасибо @Naux. – Donovan

0

Что я могу использовать, так что «старый VC» является первым, кто узнает, когда он собирается покинуть экран, чтобы он мог загружать данные, прежде чем новый будет получать эти данные?

Вы можете попробовать использовать метод – tabBarController:didSelectViewController: UITabBarControllerDelegate, чтобы сохранить данные в NSUserDefaults; это должно быть обязательно вызвано до viewWillAppear в любом контроллере.

Если вы хотите сохранить свой текущий подход, попробуйте использовать viewDidAppear: вместо viewWillAppear: во втором контроллере. Это должно работать должным образом, если вы не получаете много данных от NSUserDefaults (как и должно быть, я думаю), и если ваш второй пользовательский интерфейс контроллера не вводит задержку в показе данных.

Другой подход, который у вас есть, заключается в том, что первый контроллер обновляет свои данные в NSUserDefaults каждый раз, когда он изменяется.

+0

yep, я сделал это, но потом мне нужно перезагрузить данные после этого, поэтому он мигает на экране, а затем обновленная версия появляется через секунду –

+0

, а что с помощью 'tabBarController: didSelectViewController' для сохранения ... – sergio

0

Написание и чтение звуков напоминают ненужные накладные расходы. Если вам это вообще не нужно писать, конечно.

Я бы сделал предыдущие UIViewController все данные, обернутые в объект, на UITabBarController, который затем передал бы его новому UIViewController. Если это шаблон для всех (или большинства) ваших вкладок, создайте новый протокол и сообщите об этом UIViewController. Тогда ваш UITabBarController сможет определить, какие контроллеры нуждаются в нем, просто проверяя, соответствует ли контроллер вашему протоколу.

Смежные вопросы