Как программно изменить переменные-члены объекта пользовательского представления? - PullRequest
2 голосов
/ 05 сентября 2011

Я ценю, что вы нашли время, чтобы прочитать это и, надеюсь, выручить меня!

Я пишу свою первую программу на Xcode 4, впервые используя Objective-C и Cocoa. Я следовал учебным пособиям, но на данный момент я хочу отображать пользовательскую графику, используя пользовательский вид, где графика изменяется в зависимости от значений в моем объекте модели.

Мой класс контроллера GameController, основанный на NSObject, создает объект моей модели во время инициализации и успешно получает сообщения о действиях кнопок, соответствующим образом обновляет объект модели и, в свою очередь, обновляет текстовые строки в окне, используя его выходы. Я достиг этого, создав объект NSObject в моем xib-файле (который называется именем MainMenu.xib по умолчанию (?), Но он включает в себя весь пользовательский интерфейс в моем приложении), используя панель утилит, чтобы установить его класс в GameController, и затем подключить его действия и выходы к соответствующим элементам пользовательского интерфейса.

Я перетащил пользовательское представление в свое окно и использовал панель утилит, чтобы установить его класс для моего пользовательского класса представления BoardView, который основан на NSView. В BoardView я переопределил drawRect: заполнить фон моего представления синим цветом, а затем нарисовать каждую графику, определенную моим классом модели (GameStatus).

Проблема в том, что я не знаю, как получить доступ к данным в GameStatus из моего класса BoardView, или чтобы GameController обновил переменную-член BoardView. Я не создавал экземпляр BoardView нигде, кроме как в Интерфейсном Разработчике, опуская собственное представление в моем окне. У меня нет объекта BoardView в моем xib-файле (столбец или список слева в Interface Builder).

Я попытался создать выход для объекта BoardView в моем классе GameController (у которого действительно есть объект в моей xib, как я уже упоминал выше) и подключил этот выход к настраиваемому представлению BoardView в моем окне, и мне показался, что Interface Builder хорошо с этим. Однако когда я запускаю программу, значение указателя выхода BoardView в моем классе GameController равно 0x0. Кажется, что розетка не подключена к объекту BoardView. Я не знаю, нужно ли мне делать что-то еще в Интерфейсном Разработчике, чтобы создать реальный объект (я попытался создать его в списке слева, но потом не смог найти способ подключить его к реальному отображаемому пользовательскому представлению). на окне).

Чтобы добавить к путанице, когда я запускаю свое приложение, область BoardView окна будет отображать синий фон и фактически любую другую графику, которую я определяю в функции drawRect :. Однако без какого-либо способа общения с моим объектом модели я не могу изменить графику в зависимости от состояния модели. Я не уверен, что тот факт, что жестко запрограммированная графика отображается правильно, означает, что где-то там есть объект, или он каким-то образом рисует, основываясь на общем шаблоне класса. Последнее на самом деле не имеет смысла для меня, но если первое верно, я не могу понять, как общаться с этим объектом из других частей моего кода.

Мне кажется, что мне просто не хватает базового понимания того, как Xcode / Interface Builder создает объекты или что-то в этом роде. Я был бы очень признателен, если бы кто-нибудь сказал мне, что именно мне здесь не хватает в связи между моими объектами / классами MVC.

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

РЕДАКТИРОВАТЬ 2011/09/06: Чтобы скачать копию моего проекта и посмотреть его, перейдите по ссылке: http://talix.homeip.net/2011/rival/ Это мой домашний сервер, и я любитель в этом, поэтому, пожалуйста, оставьте комментарий, если он не работает. Спасибо! Кроме того, если есть лучший способ ответить на комментарии, кроме редактирования моего исходного сообщения, пожалуйста, дайте мне знать; Я также новичок на этом сайте. ; -) * 1 021 *

-Joe

1 Ответ

0 голосов
/ 12 сентября 2011

Звучит так, будто вы создаете только один GameController и один BoardView, и это происходит в перо.

В этом и заключается суть проблемы:

Я попытался создать выход для объекта BoardView в моем классе GameController (у которого действительно есть объект в моей xib, как я уже упоминал выше) и подключил этот выход к настраиваемому представлению BoardView в моем окне, и Interface Builderказалось, хорошо с этим.Однако когда я запускаю программу, значение указателя выхода BoardView в моем классе GameController равно 0x0.Кажется, что розетка не подключена к объекту BoardView.

Где в вашем коде вам нужна ссылка на BoardView, но вы получаете ноль?Это в методе init GameController или в каком-то другом методе GameController?

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

(Если он находится за пределами init, я бы посоветовал начать с отключения и повторного подключения розетки.)


  • Представление = BoardView
  • Контроллер = GameController
  • Model = GameStatus

В MVC контроллер обычно обеспечивает связь между моделью и представлением, поэтому яСоветуем вам справиться с этим следующим образом:

  1. Добавьте выход BoardController в BoardView и подключите его к игровому контроллеру.
  2. В drawRect, BoardView получит статус игры изигровой контроллер.

Я также предлагаю вам сделать GameController делегатом вашего приложения:

  1. Удалить RivalAppDelegate.[hm].
  2. В своем кончике удалить ссылку наRival App Delegate и подключите ссылку Game Controller к выходу делегата Владелец файла.
  3. У вас есть два экземпляра BoardView в вашем наконечнике.Подключите один внутри окна к выходу BoardView GameController и удалите другой.
  4. В GameController.h, после @interface GameController : NSObject добавьте <NSApplicationDelegate>
  5. В GameController.m, внедритеapplicationDidFinishLoading и настройте там свое приложение.(Вы можете даже позвонить туда setGameStatus, если хотите.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...