Как обратиться к предыдущим свойствам viewcontroller в стеке uinavigationcontroller? - PullRequest
2 голосов
/ 06 августа 2010

Как мне сослаться на свойства и iboutlets контроллера предыдущего представления в стеке представлений контроллера uinavigation?

Например, скажем, первый экран имеет высокий рейтинг uilabel, а второй - игра.Как мне обновить этот ярлык с экрана игры, прежде чем вернуться к нему?


РЕДАКТИРОВАТЬ

Спасибо за ответы.Я думаю, что я буду использовать Key Value Observing, чтобы изменить метод highScore для классов Singleton.Этот пост был полезен для понимания того, как это сделать: http://www.bit -101.com / blog /? P = 1969

Ответы [ 5 ]

2 голосов
/ 06 августа 2010

Вы можете использовать Наблюдение значения ключа для свойства некоторого объекта.Скажем, вы передаете Object в контроллер представления, который вы нажимаете на свой контроллер навигации с именем PlayerState.Контроллер первого вида может наблюдать это свойство

[PlayerState addObserver:self forKeyPath:@"highScore" options:NSKeyValueObservingOptionNew context:nil]

Затем каждый раз, когда объект с высокими показателями изменяется, вы получите уведомление, реализовав следующую функцию

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

Этот метод улучшает некоторые другиеметоды, потому что это разъединяет реализацию размещения ваших контроллеров представления и игровой логики.Вы можете изменить место отображения рекорда, но всегда хотите, чтобы он менялся при изменении базового объекта.Уведомления - очень похожий способ сделать это, но требует, чтобы вы отправляли уведомление каждый раз, когда вы изменяете объект с высокими показателями.КВО сделает это автоматически.

1 голос
/ 06 августа 2010

Подумайте о данных.

«Высокий балл» является глобальным для вашего приложения (для определенного типа игры, но мы предполагаем, что есть только один тип игры). Если есть другой вид, который показывает высокий балл (например, «игра окончена, вы не смогли побить рекорд»), это относится к тому же баллу, а не другому.

В этом случае сохраните счет в делегате приложения (который для большинства целей является «глобальным»); Вы можете получить это с чем-то вроде MyAppDelegate * appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];.

В качестве альтернативы, передайте «контекст» вокруг; в этом случае, может быть HighScore* или что-то еще, и сохраните счет в объекте. Это облегчает последующее расширение на несколько типов игр.

Затем используйте NSNotificationCenter для рассылки уведомлений о "высокой оценке изменено". В качестве альтернативы, используйте КВО на значении высокой оценки (хотя я никогда не использовал его).

1 голос
/ 06 августа 2010

Самый чистый способ передачи информации - использовать службу NSNotifcationCenter. Самый быстрый способ - добавить ссылку на родительский элемент viewController.

в game.h:

UIViewController *parentController;   

@property (nonatomic, retain) UIViewController *parentController;

в screen.m // перед отображением вида игры: self.gameController.parentController = self;

в игре.

parentController.highScore = highScore;
// dismiss the game viewController

Более чистый способ - использовать NSNotificationCenter. Хотя это кажется сложным, но как только вы сделаете это однажды, я думаю, вы найдете его чистым и легким.

Вот хорошее объяснение .

1 голос
/ 06 августа 2010

Вы можете сделать одно из следующих действий:

  • использовать свойство 'viewcontrollers' вашего объекта UINavigationController (ответ на ваш вопрос, но не самое лучшее решение)
  • установить метод делегата, который вызывает метод обновления для первого viewController из второго
  • использовать уведомления (рекомендуем, так как вы можете обновить счет там, где это необходимо)
0 голосов
/ 06 августа 2010

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

//gets the number of items on the navigationController stack
int arrayCount = [[[self navigationController] viewControllers] count];

//assumes you know where this view controller is on the stack in relation with the current VC (in this code example, it is the one directly below the top (hence the -1)) (tricky on occasion)
lastViewController = [[[self navigationController] viewControllers] objectAtIndex:arrayCount-1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...