【问题标题】:Prevent choosing of certain objects in NSMutableArray?防止选择 NSMutableArray 中的某些对象?
【发布时间】:2011-12-11 05:52:17
【问题描述】:

我在这里有点不知所措,因为我尝试了很多方法来实现这一点,但都失败了。

我想做什么:我的应用中有一个 NSString,它是测验中一轮问题的答案。我的答案存储在 NSMutableArray 中。这些答案是随机选择的。 我的应用中有 4 个按钮,它们是该回合的选项(可能的答案)。我不想有多个答案!

我尝试过的:

  1. 我尝试在将答案存储在其中一个按钮中后删除答案,以便无法再次选择它,但最终导致崩溃,因为我在使用快速枚举时尝试删除数组中的对象(对于循环)。
  2. 在为特定按钮设置正确答案后,我尝试检测按钮标题是否等于答案,但由于某些奇怪的原因(没有崩溃)不起作用。仍然会有多个按钮具有相同的答案

我需要什么帮助:我应该如何阻止答案出现在多个按钮中,以使测验不会显示明显的答案?

我应该怎么做?

谢谢!

Edit1:所以我几乎用我的四个 UIButton 制作了一个 NSArray。

我将答案放入一个随机的 UIButton 中,如下所示:

NSInteger chosen = (arc4random() % 4);
UIButton *randButton = (UIButton *)[buttonArray objectAtIndex:chosen];
[randButton setTitle:imageName forState:UIControlStateNormal];

然后我像这样为其他按钮命名,我没有答案的按钮的标题为空,所以我这样做:

- (void)titleButtons {
    for (UIButton *buttons in buttonArray) {
        if ([[buttons titleForState:UIControlStateNormal] == nil]) {
            UIButton *button = buttons;
            NSString *superheroString = (NSString*)[superheroArray objectAtIndex:(arc4random() % [superheroArray count])];
            [button setTitle:superheroString forState:UIControlStateNormal];
            [self checkTitles:button];
        }
    }

那么 checkTitle 方法看起来是这样的,这是我尝试确保 2 个按钮与 imageName 的答案不同的方法(答案):

- (void)checkTitles:(UIButton*)button {
    if ([[button titleForState:UIControlStateNormal] isEqualToString:imageName]) {
        //Duplicate Answer so re-title button
        NSString *newTitle = [superheroArray objectAtIndex:(arc4random() % [superheroArray count])];
        [button setTitle:newTitle forState:UIControlStateNormal];
        //Call same method again to see if new title is still same answer as pic to avoid same answers
        [self checkTitles:button];
    }
}
}

【问题讨论】:

  • 也许你只是想shuffle the array
  • 这与选择随机索引然后从该索引中获取对象有何不同?
  • 不能保证随机索引是唯一的。
  • 那么洗牌就能保证吗?
  • 不,改组使您无需使用随机索引(假设 NSMutableArray 的长度为 4 对应于您将显示的 4 个答案)。

标签: ios nsstring nsmutablearray logistics


【解决方案1】:

如果您有一个包含所有答案的 NSArray,并且您想要 1 个正确答案和 3 个不同的错误答案,您可以执行以下操作:

  1. 决定您想要正确答案的按钮。 (随机)
  2. 从您的数组中获取一个随机答案并将该答案的索引存储在一个临时数组中。
  3. 获取另一个随机答案,并确保您没有选择与临时数组中的索引相同的答案,(再次将新索引存储在临时数组中)

【讨论】:

  • #1 是我目前正在做的事情,但它不起作用。所以也许#2 和#3 结合起来对我有用,我稍后再试试! :)
  • 您还应该将已有答案的按钮保存在另一个数组中...
【解决方案2】:

不要使用 == 比较字符串。这比较指针地址。请改用isEqualToString:

if (stringA == stringB)

通常不会起作用(对于一些常量字符串会起作用)

if ([stringA isEqualToString:stringB])

将始终有效。

【讨论】:

  • 第二个代码sn -p是你的意思吗?这个问题还有其他实例吗?
  • 是的,当您检查按钮标题时。
  • 好的,现在检查一下,我试过了,我的 3 个按钮没有标题!
  • 我不确定您是否应该从 titleButtons 中删除 == nil。在这种情况下 isEqualToString 将不匹配。
  • 好的,我编辑了它。但是现在我还应该在哪里做 isEqualToString?我没有看到更多可以做到这一点的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2018-03-15
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多