gpt4 book ai didi

cocoa - 如何以编程方式创建 View 对象?

转载 作者:行者123 更新时间:2023-12-03 17:26:18 25 4
gpt4 key购买 nike

我正在 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等时,它会创建该对象的数组。

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

如果有人不介意为我指明一个好的方向,那就太好了!我真的很喜欢用 Cocoa 编程,但现在已经是一个不同的世界了。我知道会有一个学习曲线,但它与 .net 确实不同!

谢谢大家!

-亚历克

最佳答案

It's a bit weird because all the objects have the same name. I'm not sure how to programmatically give the objects a title using the counter like player1, etc, but its easy enough to pull them by key from the array with objectAtIndex. That would be part 1 of my question: in Cocoa how do I use the counter in naming the objects?

你不知道。除了少数提供专门用于命名对象的API的类(例如NSThread)外,没有其他方法可以命名对象。

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

Because from what I gather if I did:

player *player[i] = 

it would create arrays of that object when all I want to do is call it player1 etc.

不,它会声明一个名为 player 的变量来保存指向 player 对象的 i 指针的 C 数组。如果不是无效的话,它也会很麻烦,因为您将名称 player 用于两个不同的事物(一个类和一个指针变量)。

假设您如愿以偿,可以创建一堆名为 player0player1player2 等的变量。您会如何工作与他们所有人?更重要的是,您将如何与他们每个人合作?您如何为每个 View 赋予不同的播放器?您将如何将每个 View 布置到不同的位置?您将如何向需要更新的单个特定 View 发送消息?

问题的正确解决方案是第二个 NSMutableArray:这一个是 View 。将 View 放入该数组中,就像将模型对象放入玩家数组中一样。您可以维护数组,使每个索引引用一个数组中的模型对象和另一个数组中的相应 View ,因此,例如,如果您收到一条操作消息,您将在 View 数组,然后通过玩家数组中的索引获取模型对象以响应操作。

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

I mean I have that int for the whole AppDelegate so I should use it somehow.

你不需要它。

一方面,这是错误的类型。 NSArray 的索引和计数的正确类型是 NSUInteger

更重要的是,一旦您添加了所有玩家,该数字就包含了玩家数量。您可以通过向玩家数组发送 count 消息来轻松获取该信息。如果您单独了解自己拥有多少玩家,则添加或删除玩家并忘记更新自己的计数变量可能会导致另一件错误。

删除该变量。当你需要知道你有多少玩家时,只需询问数组即可。

至于限制添加的玩家数量:将玩家数量复制到局部变量中,然后倒计时。当它达到零时,您就已经添加了所需的所有玩家。或者,您也可以删除它,首先添加两名玩家,然后让用户可以根据需要添加任意数量的其他玩家。

关于cocoa - 如何以编程方式创建 View 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com