【问题标题】:Objective C - How check if all elements (NSMutableString) of NSMutableArray has a value?Objective C - 如何检查 NSMutableArray 的所有元素(NSMutableString)是否都有值?
【发布时间】:2016-05-27 15:38:01
【问题描述】:

我将用户的答案存储在数组的 NSMutableString 元素中。当数组的所有元素都具有值并且用户将完成问题时,我想显示一个弹出窗口(调用 popGoResultsAlert),我在互联网上搜索但没有成功找到解决方案。

这是我的代码:

头等舱

 [UserData updateUserAnswerValues:[userData objectForKey:@"userAnswerValues"]];

//第二类,userData.m的一部分

static NSMutableArray *userAnswerValues;

+ (NSMutableArray *)getAnswersCompleted {

    return userAnswerValues;
}

+ (void)updateUserAnswerValues:(NSArray *)newAnswerValues
{
    userAnswerValues = [[NSMutableArray alloc] init];
    [userAnswerValues addObjectsFromArray:newAnswerValues];
}




+ (void)updateUserAnswerValueWithIndex:(NSUInteger)index andValue:(NSMutableString*)value
{
    [userAnswerValues setObject:value atIndexedSubscript:index];
}

第三类:

- (void)viewWillAppear:(BOOL)animated
{
    NSMutableArray *userAnswerValues = [UserData getAnswersCompleted];

    for (int i=0; i<userAnswerValues.count; i++) {

        id object = userAnswerValues[i];// similar to [myArray objectAtIndex:0]

        if(object && [object length] !=0  && i!=0)
    {
         [self popGoResultsAlert];
        break;

    } else if (!object) {
        continue;
    }

    }

}

编辑: //第 4 类,这里似乎根据用户从 PickerView 中选择的内容将原始数据填充到 userAnswerValues,该索引具有值,并且该值由 selectedOptionValue 变量放置......我已经调试了 userAnswerValues 并注意到该值有 56 userAnswerValues = ( "", "", "", "", "", "", "", "", 4, 3, 4, 3, "", ... 等元素" 直到 56 个项目> , "" ); 所以每当用户在 PickerView 中选择一个值时,上面的元素之一用索引号填充,所以我的问题是如何搜索这些可变数组并查看所有项目是否都有值...

   NSUInteger index = [self.currentQuestion.index integerValue];
    [UserData updateUserAnswerWithIndex:index andValue:self.selectedOptionIndex];
    Option *selectedOption = [self.currentOptions objectAtIndex:[self.selectedOptionIndex integerValue]];
    NSString *selectedOptionValue = selectedOption.value;
    [UserData updateUserAnswerValueWithIndex:index andValue:selectedOptionValue];

有 3 个问题部分将所有答案的值存储在一个相同的数组中。使用上面的代码,只要 3 个部分中的每一个都完成就会弹出警报,我的意图是它只会在所有 3 个部分都完成时才显示弹出......

我有测试[object length] !=0 , ![object isEqual:[NSNull null]] , ![object isEqualToString:@""] 没有运气,所有 3 有相同的行为(显示每个部分完成后弹出,

这些项目不是我从头开始编写的,所以我正在尝试调试和修复其中的一些错误,当我调试 userAnswerValues 时,我看到 NSMutableArray 的项目在不同的元素类型中有不同的类型,正如你看到的项目第 32 项是 _NSFConstantString,值为空,而第 33 项是 NSTagedPointerString……详情请看附件。

【问题讨论】:

  • 使用 bool 值或检查 i == lastObject [你知道这是数组的结尾],然后放 show alert。
  • 仅供参考 - object 不能是 nil。无需检查是否是。
  • @user3344236 据我所知,数组的项目没有按顺序填写,因为有3个部分的问题,所有这3个部分的值都存储在同一个数组中,所以用户可能首先选择第三部分来回答,所以最后一个对象可能完成,但第一和第二部分是空的,所以在这种情况下我不想显示弹出窗口,只有当数组的所有项目都有一个值时.. .
  • @user3344236,你能在源代码中告诉我如何用布尔值解决它吗?
  • 你看到不同类型的原因是 NSString 是一个类簇。它实例化的对象是各种优化的具体子类,只能被视为 NSString 或 CFString。他们符合成为那些人的要求。

标签: ios objective-c arrays nsmutablearray


【解决方案1】:

我认为您需要的与之前的答案非常相似。在这里,我会翻译成你的数据名称。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    BOOL showPopup = YES;    // Assume success
    NSMutableArray *userAnswerValues = [UserData getAnswersCompleted];

    // Try to go all the way through the array without finding an empty string
    for (int i = 0; i < userAnswerValues.count; i++) {
        id object = userAnswerValues[i];
        if ([object length] == 0) {
            showPopup = NO;  // Something is not filled in
            break;
        }
    }
    if (showPopup) {
        [self popGoResultsAlert];
    }
}

【讨论】:

    【解决方案2】:
    Bool nilBool = 0;
    for (int i = 0 ; i < yourArray.count; i ++)
    {
          NSString *value = [yourArray ObjectAtIndex:i];
    
          if([value isEqual: @""] || value == nil)
          {
              nilBool = 1;
          }
    }
    
    if(nilBool)
    {
         //one if your values is nil!
    }
    else
    {
        //all values are filled, you are good to go
    }
    

    【讨论】:

    • 那应该是什么?它甚至根本不是对 OP 的回答。
    • 巴希尔,我试过你的代码,在 NSString *value = [yourArray ObjectAtIndex:i]; ,当我替换我的 NSMutableArray 时,我的代码出现编译错误,上面写着: No Visible @interface for 'NsMutableArray' declarations the selector objectAtIndex
    • 我在没有xcode的情况下写了这个,语法是这样的 [yourArray objectAtIndex:0];
    猜你喜欢
    • 2019-12-22
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多