Предотвратить сброс ViewController - UinavController + Скаущество + Segue's

StackOverflow https://stackoverflow.com/questions/8318752

Вопрос

Мне нужна помощь в выборе «правильного» решения для следующей «проблемы».

Я использую новую функцию раскадровки, чтобы связать все экраны моего приложения вместе. В основном структура сверкает до:

Навигационный контроллер] => [Просмотр контроллера #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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top