0

好的 - 不太明白这里发生了什么。我正在构建一个简单的纸牌游戏。我创建了一个 UIView 类别来处理“卡片”应该包含的所有内容。我认为这无关紧要,但也许不是。

无论如何,在我的视图控制器中,我只是创建了 2 个 NSMutableArrays 来握住庄家和玩家的手。然后我正在调用一个方法来设置卡值。在该方法中,我执行 NSLog 来查看特定卡片对象的值 - 一切看起来都不错。但是,如果我尝试从我的视图控制器中获取该值,它总是会为所有具有数组中最后一个对象的值的对象返回。

一些代码:

playersCards = [[NSMutableArray alloc] initWithObjects:[[UIView alloc] init],[[UIView alloc] init],nil];

[[playersCards objectAtIndex:0] setCardValue];
[[playersCards objectAtIndex:1] setCardValue];

NSLog(@"1: %i",[[playersCards objectAtIndex:0] returnValue]);
NSLog(@"2: %i",[[playersCards objectAtIndex:1] returnValue]);

因此,当我在调用 setCardValue (这在类别内)后得到 NSLog 时——再次,一切都很好。但是那些 NSLogs 就在那里 - 它们为两者返回索引 1 的值。这里发生了什么事?

4

1 回答 1

4

除非您正在做一些令人费解的事情,否则该setCardValue方法无法知道 Card 的索引。因此,您可能确实有两张卡,但它们的初始化方式相同。

然而,这里有一个更大的问题。你真的不想像这样使用UIView实例作为数据。您真的想将在屏幕 [View] 上渲染内容的位与保持游戏状态 [model] 的位分开。通常在两者之间有一个层,它根据用户与视图 [控制器] 的交互来管理模型状态。

有关更多信息,请参阅有关模型视图控制器的文档。


用类别将东西挂在现有类上似乎很方便,但它确实不应该用作在应用程序中封装数据、状态和/或逻辑的主要模式。

您确实希望将数据 [游戏状态] 与数据在屏幕上的绘制方式 [视图] 隔离开来。

就您评论中的具体问题而言,另一个问题是:

想象一下你的代码是这样写的:

Card *c = [cardArray objectAtIndex: 0];
[c doSomething];

如何c知道它在该代码中的索引?现在,请注意,所述代码与[[cardArray objectAtIndex:0] doSomething];.

如果我正在设计某种纸牌游戏,我可能会创建一些类:

  • 一个Card简单地存储西装和价值的类。支持 NSCoding 用于归档目的。

  • 一个CardView子类UIView,给定一个花色和价值,知道如何渲染一张卡片。

  • 一组知道如何绘制运动场(前GameFieldViewGameFieldControllerUIView 子类)以及如何在运动场上移动 CardView(后者,UIViewController)的类

  • 它的特定子类GameFieldController为诸如手、堆栈、堆和/或创建纸牌游戏可能需要的任何其他事物添加逻辑。

.... ETC ....

也就是说,我会将游戏分解为一系列适合 iOS 或 OS X 模型视图控制器模式的类,这样我就可以编写最少的代码并让系统完成其设计的繁重工作做。

对于所有这些类和所有这些类,这似乎有点过头了,但实际上,各个类相对简单且非常灵活。

于 2013-05-18T05:59:59.207 回答