#ios
#iOS
Вопрос:
Я создаю простую игру для iOS, в которой есть счетчик, который отслеживает оценку пользователей и представляет ее в UILabel в углу экрана. Когда что-то происходит в игре, она переключается на экран game over. Затем я хочу отобразить содержимое метки из предыдущего представления в метке в новом представлении по мере того, как игроки набирают очки.
Я чувствую, что должен быть простой способ сделать это?
Заранее спасибо!
Ответ №1:
Основная причина проблемы заключается в том, что вы встроили свою игровую логику в свой пользовательский интерфейс. Оценка не является частью пользовательского интерфейса, но вы все равно ее туда поместили.
Если ваша игра действительно простая, добавьте в делегат приложения свойство, которое отслеживает счет. Каждая часть вашего пользовательского интерфейса может получить доступ к этому свойству, когда это необходимо.
Как только вы выйдете за рамки самой простой из возможных игр, вам следует выделить свою игровую логику в отдельный класс. Этот класс отвечает за управление состоянием игры. Создавайте его при запуске новой игры, и вы можете передавать его в контроллеры просмотра, создавать общий экземпляр и т. Д.
Я бы рекомендовал ознакомиться с MVC.
Комментарии:
1. Ладно, спасибо тебе за помощь. Я думаю, что моя игра, вероятно, достаточно проста, чтобы сохранить игровую логику в пользовательском интерфейсе, но я обязательно подумаю о создании отдельного класса в будущем. Могу я просто спросить, в чем проблема с тем, чтобы делать это так, как у меня есть?
Ответ №2:
Просто сделайте метку a @property
и используйте self.navigationController.presentingViewController
или что-то подобное для доступа к первому контроллеру представления:
@interface ViewControllerOne : UIViewController {
IBOutlet UILabel *myLabelOne;
}
@property (nonatomic, retain) IBOutlet UILabel *myLabelOne;
@end
@interface ViewControllerTwo : UIViewController {
IBOutlet UILabel *myLabelTwo;
}
// myLabelTwo doesnt need to be a property, it could just be an ivar. Up to you.
@property (nonatomic, retain) IBOutlet UILabel *myLabelTwo;
@end
@implementation ViewControllerTwo
- (void)viewDidLoad {
[super viewDidLoad];
self.myLabelTwo.text = [(ViewControllerOne *)self.navigationController.presentingViewController myLabelOne].text;
}
@end
UINavigationController
Ссылка на класс
UIViewController
Ссылка на класс
Свойства в Objective-C 2.0
Комментарии:
1. Хорошо, спасибо. Я пробовал это, но
self.endScore.text = [(Meteor_FieldViewController *)self.navigationController.presentingViewController score].text;
выдавал мне ошибку Ссылочный базовый тип элемента ‘void’ не является структурой или объединением2. Это странная ошибка .. можете ли вы добавить еще немного этого кода и полную трассировку ошибок / стека в свой вопрос, чтобы я мог видеть это немного лучше?
Ответ №3:
Отойдите на секунду от своих представлений. Ваши метки и любые другие представления — это место для представления данных, а не для их хранения. То, что вы хотите поделиться на экранах, — это оценка, которая является частью состояния вашего игрока.
Создайте Player
объект. Дайте ему score
свойство. Передайте один и тот же Player
экземпляр контроллерам обоих представлений. Теперь у вас есть модель, разделяемая несколькими контроллерами и представленная во многих представлениях. Любой контроллер потенциально может обновить модель, а другой имеет доступ к новому состоянию для отображения в своих представлениях.
Комментарии:
1. Хорошо, я попробую это сделать. Спасибо тебе за помощь, Иона!