如何以编程方式创建视图对象?

时间:2010-10-14 22:12:35

标签: cocoa

我正在为Cocoa的2-4名玩家构建一个简单的游戏。这是我的第一个Cocoa应用程序,所以不熟悉库,我可能做了很多奇怪的事情。如果你看到任何可以做得更好的事情,那就这么说吧。

第一步要求用户从NSPopUp中选择玩家数量,并将数据拉入int。我在一些播放器对象中创建一个数组和循环。

- (IBAction)startGame:(id)sender {

// Get value of playersPopup into a string
NSString *playersReturn = [[NSString alloc] initWithString:[playersPopup titleOfSelectedItem]];

// Convert that string to an int
numberOfPlayers = [playersReturn intValue];

// Create an array
playerArray = [[NSMutableArray alloc] init];

// Create a counter
int i = 0;

// While counter is less than number of players, create player object and add to array
while (i < numberOfPlayers) {

    // Create a player object
    Player *player = [[Player alloc] init];

    // Add player to array
    [playerArray addObject:player];

    // Increment
    i++;

} 

}

这有点奇怪,因为所有对象都有相同的名称。我不确定如何使用像player1等计数器以编程方式给对象一个标题,但它很容易通过objectAtIndex从数组中取出它们。这将是我的问题的第一部分:在Cocoa中如何使用计数器命名对象?因为如果我这样做,我会收集:

player *player[i] = 

当我想要做的就是将它称为player1等时,它会创建该对象的数组。

第二个问题是:我有另一个视图,在创建播放器对象后,用户看到NSTextFields输入播放器的名称。鉴于我应该在AppDelegate中声明IBOutlets,我不确定如何为2-4名玩家提供。我可以声明所有4个出口,只使用两个,然后只是以编程方式隐藏未使用的文本字段。但似乎应该有一种方法来根据选择了多少玩家来创建出口和查看对象。我的意思是我有整个AppDelegate的int,所以我应该以某种方式使用它。

如果有人不介意给我指好方向,那就太棒了!我非常喜欢用Cocoa编程,但在这一点上它是一个不同的世界。我知道会有一个学习曲线,但它与.net真的不同。

谢谢你们!

-Alec

1 个答案:

答案 0 :(得分:0)

  

这有点奇怪,因为所有对象都有相同的名称。我不确定如何使用像player1等计数器以编程方式给对象一个标题,但它很容易通过objectAtIndex从数组中取出它们。这将是我的问题的第一部分:在Cocoa中如何使用计数器命名对象?

你没有。除了几个专门为命名对象提供API的类(例如,NSThread)之外,没有办法命名对象。

你所说的是声明变量,它包含指向对象的指针。这些变量与对象本身是分开的;你甚至可以让多个变量都指向同一个对象。命名变量不会影响它可能指向的对象。

  

因为我收集的内容是:

player *player[i] = 
     

当我想要做的就是将它称为player1等时,它会创建该对象的数组。

不,它会将名为player的变量声明为持有iplayer个对象的C数组。如果没有效果,它也会很毛茸茸,因为你使用名称player来表示两个不同的东西(一个类和一个指针变量)。

假设您已经实现了愿望,并且可以创建一组名为player0player1player2等的变量。您将如何使用它们?更重要的是,你会如何与他们合作?你会如何给每个视图一个不同的玩家?你会如何将每个视图布置到不同的地方?如何将消息发送到需要更新的单个特定视图?

问题的正确解决方案是第二个NSMutableArray:这是一个视图。就像将模型对象放入播放器数组一样,将视图放入该数组中。您可以维护数组,使每个索引引用一个数组中的模型对象和另一个数组中的相应视图 - 例如,如果您收到操作消息,则需要在该数组中查找该视图的索引。 views数组,然后通过players数组中的索引获取模型对象以响应操作。

该解决方案的更强大的变体,但也更多的工作,将循环遍历搜索具有特定玩家的视图的数组。这个解决方案不需要它们具有相同的顺序,并且可以使您能够处理玩家视图(不应该发生)的情况,该视图的玩家已从模型数组中丢失。但是,正如我所说,这对你和程序来说都是更多的工作(也就是说它更慢)。我可能只是做并行数组。

  

我的意思是我有整个AppDelegate的int,所以我应该以某种方式使用它。

你不需要它。

首先,这是错误的类型。索引的正确类型和NSArrays的计数是NSUInteger

更重要的是,一旦添加了所有玩家,该数字就包含了玩家数量。您可以通过向玩家阵列发送count消息来轻松获取该信息。如果你对你拥有的玩家数量保持不同的了解,那么通过添加或删除玩家并忘记更新自己的计数变量,还有一件事可能会出错。

删掉那个变量。当你需要知道你有多少玩家时,只需询问阵列。

至于限制添加的玩家数量:将玩家数量复制到本地变量,并将其计算在内。当它达到零时,你已经添加了你需要的所有玩家。或者,您也可以将其删除,添加两个玩家,并允许用户添加任意​​数量的其他玩家。