【问题标题】:Best way to add multiple images to what kind of array?将多个图像添加到哪种数组的最佳方法?
【发布时间】:2011-09-04 18:14:23
【问题描述】:

我正在为字母表中的所有字母创建可拖动的字母图块。如果一个单词需要多个相同的字母,我会为每个字母创建 5 个。

我在 MainViewControllers ViewDidLoad: 方法中以编程方式创建每个 UIImageView。

- (void)ViewDidLoad:
{
        for (int i = 1; i <= 5; i++)
    {
        letterA = [[LetterTiles alloc] initWithFrame:CGRectMake(39, 104, 70, 70)];
        [letterA setImage:[UIImage imageNamed:@"a.png"]];
        letterA.tag = i;
        [letterA setUserInteractionEnabled:YES];
        [self.view addSubview:letterA];
        [letterA release];

    for (int i = 1; i <= 5; i++)
    {
        letterB = [[LetterTiles alloc] initWithFrame:CGRectMake(112, 104, 70, 70)];
        [letterB setImage:[UIImage imageNamed:@"b.png"]];
        letterB.tag = i;
        [letterB setUserInteractionEnabled:YES];
        [self.view addSubview:letterB];
        [letterB release];
    }

    for (int i = 1; i <= 5; i++)
    {
        letterC = [[LetterTiles alloc] initWithFrame:CGRectMake(185, 104, 70, 70)];
        [letterC setImage:[UIImage imageNamed:@"c.png"]];
        letterC.tag = i;
        [letterC setUserInteractionEnabled:YES];
        [self.view addSubview:letterC];
        [letterC release];
    }   
}

我有几个问题:

  1. 我应该为每个字母创建一个数组,还是为所有字母创建一个数组?

  2. 我应该使用什么样的数组? NSMutableArray/NSArray 还是 NSMutableDictionary/NSDictionary? - 我一直在试图弄清楚如何将所有这些字母添加到所有上述数组类型中,然后根据它们的字母和标签检索它们,但我一生都无法弄清楚。有人愿意给我看一个代码中一两个字母的例子吗?

  3. 有没有比我在这里展示和询问的更好的方法来做到这一点?

【问题讨论】:

    标签: iphone ios ipad uiimageview


    【解决方案1】:

    问题 1

    为所有字母使用一个 NSArray 更好,它减少了您必须处理的变量数量。有这样的东西:

    NSArray *arrayA;
    NSArray *arrayB;
    NSArray *arrayC;
    ...
    NSArray *arrayZ;
    

    只是很多代码,可以在单个数据结构中轻松访问,更不用说,如果您计划添加数字、标点符号等,更容易更新。

    问题 2

    可变意味着它可以更新,所以重要的问题是,你的数组/字典应该在运行时更新吗?如果答案是否定的,那么非可变数组可能会更好。另一方面,您必须自动用很多东西填充数组,因此拥有可变版本可能会让您拥有更简洁的代码(而不是拥有[[NSArray alloc] initWithObjects:[UIImage imageNamed:@"A"], ...])。

    所以我会使用可变版本,只是为了更简洁的代码。

    问题 3

    这是个人选择,但我不喜欢在静态类型语言中使用嵌套数据结构(在 python 中这样做是一种幸福,例如myDictArray["key"][1])。我会使用组成键的可变字典来存储相关数据:

    NSString *key = [NSString stringWithFormat:"%c%d", letter, number]; // For example "J3" is the 3rd J letter.
    

    另一方面,我不会使用图像,而是使用大方形 UILabel,以节省内存(以及精神上的理智,处理那么多图像,呃),然后选择 iOS 使用的众多字体中的一种 ( Here's a complete list)。

    有了这个,生成所有内容,需要两个嵌套的 fors,一个遍历每个字母,然后每 5 次重复一个,然后创建标签并将其放入字典中(我会编写代码,但我m 不在 Mac 上)。

    【讨论】:

    • 哇!感谢您提供如此详细的深思熟虑的答案。对此,我真的非常感激。不幸的是,我不能只使用标签,因为字母图像的纹理看起来像木头。除非这可以用 UILabel 完成?此外,一旦我将所有图像添加到 NSMutableDictionary 中,我是通过调用 [self.view addSubview letterA] 在 vi​​ewdidload 方法中显示它们还是会 [self.view addSubview letterAFromArray] (letterAFromArray 只是我编造的代码但知道如何将字典中的所有 5 个字母放到视图中。)我相信我可以弄清楚。 :)
    • 迭代时,创建对象,加入字典,加入子视图,释放。
    • 有效!啊!我无法告诉你我花了多长时间才找到将所有这些 UIImageViews 放入数组/字典的最佳方法。你让我的周末男人。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多