Один экземпляр для нескольких представлений в Cocoa Touch - PullRequest
1 голос
/ 12 мая 2009

Мне было интересно, как мне получить доступ к одному экземпляру класса, скажем, «класс корабля» в нескольких представлениях.

Допустим, у меня есть rootViewController и три подпредставления, одно основное, одно сражение и одна посадка. Где именно я бы реализовал экземпляр класса, который хранит всю информацию на моем корабле и получает к ней доступ через другие представления. Если на моем корабле осталось x ракет, как другой вид получает доступ к этой информации для ее отображения. Если я реализую его в главном окне, как информация о посадке получает эту информацию?

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

Заранее благодарю за любую помощь, которую вы все можете оказать.

Ответы [ 2 ]

3 голосов
/ 12 мая 2009

После того, как вы создали один экземпляр вашего класса Корабль, вам нужно сообщить другим представлениям, что это за экземпляр. Таким образом, вы можете сделать Ship публичной собственностью класса, который его создал.

@property (nonatomic, retain) Ship* myShip;

Предположим, что класс является делегатом приложения - тогда в другом файле вы напишите что-то вроде

[[[UIApplication sharedApplication] delegate].myShip getNumberOfMasts];

Это просто и работает для простого проекта, но он делает объект Ship доступным для любого файла в вашем проекте - он фактически становится глобальными данными, которые трудно отладить в более крупном проекте. (Если с myShip происходит что-то плохое, какой объект был ответственным? Если это может быть какой-либо объект в вашем приложении, то это более трудная проблема для отладки, чем если бы доступ был ограничен двумя классами, которым это нужно.) Итак, если вы хотите ограничить доступ к отправке, затем не делайте myShip открытым свойством - вместо этого пусть объект, создавший myShip, передает его в вызовах инициализации, когда он создает другие объекты, к которым требуется доступ. Примерно так

[[myBattleController alloc] initWithShip:myShip];

Если это действительно один и тот же объект корабля для всего приложения, найдите переполнение стека для получения совета по созданию одноэлементных объектов.

1 голос
/ 12 мая 2009

Ваш класс корабля - Модель в MVC (контроллер вида модели). Это был бы отдельный класс. Ваши 3 представления являются частью представления MVC. Все, что вам не хватает, это контроллер. Контроллер создает вашу модель (например, класс корабля) и ваши виды и хранит ссылки на все это.

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

Существует несколько подходов для передачи данных для просмотра. Два возможных варианта: добавить методы для просмотра, чтобы передавать данные в него (например, показать некоторую информацию в представлении). Второй вариант, возможно, более применимый здесь, заключается в том, что для каждого представления сохраняется ссылка на модель - он используется только для доступа «только для чтения». Например. когда ваши представления необходимо повторно отобразить, они получают точные данные от модели (класса корабля).

Посмотрите на шаблон MVC, там много информации даже в документации Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...