Предотвратить сброс viewcontroller - UINavcontroller + Раскадровка + Segue's - PullRequest
2 голосов
/ 30 ноября 2011

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

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

[Navigation Controller] => [View Controller # 1] => [Tabbar Controller] => [View Controller # 2] *

** (инекоторые другие вкладки, которые на данный момент не важны) *

Я прикрепил переход (push) от первого контроллера вида (# 1) к контроллеру вида за контроллером панели вкладок.Это нажатие срабатывает, когда пользователь что-то нажимает на первом контроллере и работает нормально.

// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];

Когда пользователь (который теперь находится в View Controller # 2) нажимает кнопку возврата в навигационной панели, на которую пользователь нажимаетназад.Предположим, что он теперь снова запускает переход, второй контроллер представления снова отображается, но теперь «сброшен» (пуст).(Я полагаю, что после прочтения нескольких форумов и статей это стандартное поведение при использовании segue, поскольку они каждый раз уничтожают и повторно инициализируют контроллер представления?)

Это (сброс контроллера представления) создает проблему, поскольку содержимоеКонтроллер второго представления является динамическим (зависит от ответа JSON от сервера), и поэтому «необходимо», чтобы контроллер представления оставался неповрежденным (или восстанавливался), когда пользователь возвращается.

Я нашел несколько источников(см. внизу) описание той же проблемы, но решения различаются, и мне нужна помощь в выборе правильной.

Подведите итог:

  • Как я могу «сохранить» / сохранить состояниеКонтроллера Представления, когда пользователи нажимают назад, сохраняя использование Раскадровки и предпочтительно также

Собственных Мысли Segue:

# 1 Я сейчасподумав о кэшировании ответа JSON в мой одноэлементный класс (и оттуда в PLIST) и проверке во втором контроллере представления, еслиесли данные присутствуют, а затем перестраиваем представление, после чего я проверяю наличие новых данных (возобновить нормальную работу).

# 2 Еще один вопрос, о котором я думаю, - это «обход» переходаи вручную обработать переключение представлений, частично объясненное в ( Раскадровка - обратитесь к ViewController в AppDelegate ) - Это также возможно?

Но, возможно, есть более простой / лучший вариант?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Раскадровка - обратитесь к ViewController в AppDelegate Как сериализовать UIView?

Ответы [ 3 ]

2 голосов
/ 10 марта 2012

Yess !!Я получил решение.Выполните следующие действия:

В вашем файле .h:

@property (strong, nonatomic) UITabBarController *tabController;

В вашем файле .m:

@synthesize tabController;

tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

Выбранный индекс - это вкладка, на которую вы хотите перейти

tabController.selectedIndex = 1;

[[self navigationController] pushViewController:tabController animated:YES];
0 голосов
/ 30 июля 2012

Это может быть даже более простое решение (без использования свойств - на самом деле, все экземпляры вашего класса не должны знать о своих контроллерах назначения, поэтому просто сохраните их как статические в функции pushing):

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];

ps DLog - это всего лишь мой вариант NSLog.

Но действительно интересно, как это сделать с помощью segue?

0 голосов
/ 03 декабря 2011

Для любого, кто столкнется с этим (моим) вопросом в будущем, вот как я закончил «кодировать» его.

  • Откройте раскадровку и выберите свой «Контроллер панели вкладок».и откройте инспектор атрибутов

  • Заполните 'идентификатор' в поле

  • с первым контроллером представления (см. сценарий в исходном посте)Я создаю глобальную ссылку на viewcontroller:

firstviewcontroller.h

@interface YourViewController : UIViewController {

    UITabBarController *tabController;

}

firstviewcontroller.m

//Fill the reference to the tabcontroller using the identifier
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"];

Теперь для переключения с первого контроллера просмотра можно использовать следующую строку:

[[self navigationController] pushViewController:tabController animated:YES];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...