Предотвратить сброс ViewController - UinavController + Скаущество + Segue's
-
25-10-2019 - |
Вопрос
Мне нужна помощь в выборе «правильного» решения для следующей «проблемы».
Я использую новую функцию раскадровки, чтобы связать все экраны моего приложения вместе. В основном структура сверкает до:
Навигационный контроллер] => [Просмотр контроллера #1] => [Controller] => [Контроллер представления #2]*
** (и некоторые другие вкладки, которые сейчас не важны)*
Я прикрепил переход (толчок) от первого контроллера представления (#1) к контроллеру представления за контроллером стержня. Этот толчок запускается, когда пользователи нажимают что -то на первом контроллере, и работает нормально.
// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];
Когда пользователь (который сейчас находится в контроллере View #2) нажимает кнопку «Задняя часть» в Navbar, пользователь возвращается. Предположим, что теперь он снова запускает переход, второй контроллер представления снова показан, но теперь «сброшен» (пусто). (Я полагаю, что после прочтения нескольких FORA и статей это стандартное поведение при использовании Segue's, потому что они уничтожают и повсеместно разбираются с контроллером вида?)
Этот (контроллер представления сброшен) создает проблему, потому что содержимое контроллера второго представления является динамическим (зависит от ответа JSON с сервера), и, таким образом, «необходимо», что контроллер представления остается неповрежденным (или восстановлен), когда), когда Пользователь возвращается.
Я нашел несколько источников (см. Внизу), описывающих ту же проблему, но решения различаются, и мне нужна помощь, чтобы выбрать правильную.
Подвести итог:
- Как я могу «сохранить»/сохранить состояние контроллера представления, когда пользователи нажимают, сохраняя при этом использование раскадровки и предпочтительно, также переходит
Собственные мысли:
#1 Теперь я думаю о кэшировании ответа JSON на мой класс Singleton (и оттуда в PLIST) и проверку во втором контроллере представления, если эти данные присутствуют, и чем перестроить представление, после чего я проверяю какие -либо новые данные (резюме нормально операция).
#2 Еще один, о котором я думаю, - это «обходить» переход и вручную обрабатывать переключение взглядов, частично объясненное (Рассказывают - см. ViewController в AppDelegate) - Это также возможно?
Но, может быть, есть более простой/лучший вариант?
http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Рассказывают - см. ViewController в AppDelegate Как сериализовать uiview?
Решение 2
Для тех, кто сталкивается с этим (моим) вопросом в будущем, я и в конечном итоге он был «кодировал».
Откройте раскадровку и выберите «Контроллер стержней» и откройте инспектор атрибутов
Заполните «идентификатор» в поле
С помощью первого контроллера представления (см. Сценарий в оригинальном сообщении) я создаю глобальную ссылку на ViewController:
FirstViewController.h
@interface YourViewController : UIViewController {
UITabBarController *tabController;
}
FirstViewController.m
//Fill the reference to the tabcontroller using the identifier
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
Теперь, чтобы переключиться с FirstViewController, можно использовать следующую строку:
[[self navigationController] pushViewController:tabController animated:YES];
Другие советы
Да !! Я получил решение. Сделайте следующее:
В вашем файле .h:
@property (strong, nonatomic) UITabBarController *tabController;
В вашем .m -файле:
@synthesize tabController;
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];
Выбранный индекс - это вкладка, которую вы хотите пойти
tabController.selectedIndex = 1;
[[self navigationController] pushViewController:tabController animated:YES];
Это может быть еще более простое решение (без использования свойств - на самом деле, все экземпляры вашего класса не должны знать о своих контроллерах назначения, поэтому просто сохраните его как статичную в функции толкания):
static UIVewController *destController = nil;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
if (!storyboard) {
DLog(Storyboard not found);
return;
}
if (destController == nil) { //first initialisation of destController
destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"];
if(!destController) {
DLog(destController not found)
return;
}
}
//set any additional destController's properties;
[self.navigationController pushViewController:destController animated:YES];
пса DLog
это просто мой вариант NSLog
.
Но действительно интересно, как это сделать с Segue?