Перенос содержимого метки с одного контроллера представления на другой

#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. Хорошо, я попробую это сделать. Спасибо тебе за помощь, Иона!