xcode - 如何以编程方式更改自定义 View 对象的成员变量?

标签 xcode cocoa interface-builder custom-view

感谢您花时间阅读本文并希望对我有所帮助!

我正在 Xcode 4 中编写我的第一个程序,第一次使用 Objective-C 和 Cocoa。我一直在关注教程,但此时我想使用自定义 View 显示自定义图形,其中图形根据模型对象中的值而变化。

我的 Controller 类 GameController 基于 NSObject,在初始化期间创建我的模型对象,并成功接收按钮操作消息,适当更新模型对象,并使用其输出更新窗口上的文本字符串。我通过在我的 xib 文件中创建一个 NSObject 对象(称为 MainMenu.xib 的默认(?)名称,但它包括我的应用程序中的所有 UI),使用实用程序 Pane 将其类设置为 GameController 来完成此操作,然后然后将其操作和导出连接到适当的 UI 元素。

我已将自定义 View 拖到窗口中,并使用实用程序 Pane 将其类设置为我的自定义 View 类 BoardView,它基于 NSView。在 BoardView 中,我重写了 drawRect: 以用蓝色填充 View 的背景,然后绘制由模型类 (GameStatus) 定义的每个图形。

问题是,我不知道如何从 BoardView 类访问 GameStatus 中的数据,或者让 GameController 更新 BoardView 的成员变量。除了在 Interface Builder 中之外,我还没有通过在窗口上放置自定义 View 来实例化 BoardView。我的 xib 文件(Interface Builder 中左侧的列或列表)中没有 BoardView 对象。

我尝试在我的 GameController 类中创建一个 BoardView 对象的导出(正如我上面提到的,它在我的 xib 中确实有一个对象),并将该导出连接到我的窗口中的 BoardView 自定义 View ,并且 Interface Builder 似乎没关系。然而,当我运行程序时,我的 GameController 类中 BoardView 导出指针的值为 0x0。 socket 似乎没有连接到 BoardView 对象。我不知道是否需要在 Interface Builder 中做其他事情来创建一个实际的对象(我尝试在左侧列表中创建一个对象,但后来无法找到一种方法将其连接到显示的实际自定义 View 在 window 上)。

更令人困惑的是,当我运行应用程序时,窗口的 BoardView 区域将显示蓝色背景,实际上还有我在 drawRect: 函数中定义的任何其他图形。但是,由于无法与我的模型对象对话,我无法根据模型的状态更改图形。我不确定硬编码图形正确显示的事实是否意味着某处有一个对象,或者它是否以某种方式基于类的通用模板进行绘制。后者对我来说并没有真正的意义,但如果前者是正确的,我将无法弄清楚如何从代码的其他部分与该对象进行通信。

我觉得我只是缺少对 Xcode/Interface Builder 如何创建对象或其他东西的一些基本理解。我真的很感激有人准确地告诉我我在 MVC 对象/类之间的连接中缺少什么。

预先感谢您为我提供的任何帮助!

编辑2011/09/06: 要下载我的项目的副本以进行查看,请转到此处: http://talix.homeip.net/2011/rival/ 这是我的家庭服务器,我对此是业余爱好者,所以如果它不起作用,请发表评论。谢谢!另外,如果除了编辑我原来的帖子之外,还有更好的方式回复评论,请告诉我;我也是这个网站的新手。 ;-)

-乔

最佳答案

听起来你只是实例化一个 GameController和一个BoardView ,这发生在 Nib 。

这就是问题的核心:

I tried to create an outlet to a BoardView object in my GameController class (which does have an object in my xib, as I mentioned above), and connecting that outlet to the BoardView custom view in my window, and Interface Builder seemed fine with that. However, when I run the program, the value of the BoardView outlet pointer in my GameController class is 0x0. It seems like the outlet is not being connected to a BoardView object.

您的代码中的哪个位置需要对 BoardView 的引用但却为零?是在 GameController 的 init 方法中,还是在 GameController 的其他方法中?

如果它在 init 内部,这就是我所期望的。加载 nib 的代码必须在连接 socket 之前初始化对象。

(如果它在 init 之外,我建议首先断开并重新连接 socket 。)

<小时/>
  • View = BoardView
  • Controller =游戏 Controller
  • 模型 = 游戏状态

在MVC中, Controller 通常代理模型和 View 之间的通信,所以我建议你这样处理:

  1. 将 gameController socket 添加到 BoardView 并将其连接到您的游戏 Controller 。
  2. drawRect ,让 BoardView 从游戏 Controller 获取游戏状态。

我还建议您将 GameController 作为您应用程序的委托(delegate):

  1. 删除RivalAppDelegate.[hm] .
  2. 在您的 Nib 中,删除对 Rival App Delegate 的引用,并将 Game Controller 引用连接到 File's Owner 委托(delegate) socket 。
  3. 您的 Nib 中有两个 BoardView 实例。将窗口内的一个连接到 GameController 的 boardView 导出,然后删除另一个。
  4. GameController.h ,之后 @interface GameController : NSObject ,添加<NSApplicationDelegate>
  5. GameController.m ,实现applicationDidFinishLoading并在那里设置您的应用程序。 (如果您愿意,您甚至可以调用setGameStatus。)

关于xcode - 如何以编程方式更改自定义 View 对象的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7303970/

相关文章:

ios - 获取 WKWebView 的当前内存使用情况?

c++ - 组合 2 个函数时 Xcode 出错

iphone - Instruments 的内存泄漏工具是否存在 'for' 循环问题?

macos - 使用带有 Interfacebuilder 的 NSPageController 来设置 View

ios - Xcode 在运行时启用 UIFileSharing

ios - 在 XCUITest 中,用于查找 TableView 单元格和节标题显示顺序的语法

swift - 验证 NSTouchBar 项目的最佳实用方法

iphone - 如何在 Interface Builder 中创建 NSToggleButton?

iphone - 在 Interface Builder UIImageView 中从 Xcode "Folder Reference"访问图像

iphone - 将 block 闭包存储为 IBAction