如何在 objective-C 中使用字符串而不是索引从数组中删除数据进行比较

How to remove data from an array comparing using string not an index in objective-C

提问人:Mihir Oza 提问时间:7/8/2020 最后编辑:greg-449Mihir Oza 更新时间:7/8/2020 访问量:44

问:

我有一个字典数组,如下所示

    self->arrField: (
        {
        fieldname = "Have you ever had any one of the following:";
        fieldvalue =         (
            Diabetes,
            Hypertension
        );
        tagvalue = 0;
    },
        {
        fieldname = "By continuing with this survey, you agree to our terms of use and Parsons Information Governance and Privacy Policies, Procedures and Standards, available on the Corporate Policy Center.";
        fieldvalue = Agree;
        tagvalue = 1;
    },
        {
        fieldname = "Have you tested positive for COVID-19 in the last 10 days?";
        fieldvalue = No;
        tagvalue = 4;
    },
        {
        fieldname = "Do you have any known heart conditions or on any medications that elevate your heart rate";
        fieldvalue = Yes;
        tagvalue = 6;
    },
        {
        fieldname = "Have you received a COVID-19 test in the past 48 hours";
        fieldvalue = Yes;
        tagvalue = 7;
    },
        {
        fieldname = "In the last 48 hours have you experienced any of these symptoms";
        fieldvalue =         (
            cough,
            fever
        );
        tagvalue = 10;
    }
)  

因此,如果用户更改了我需要替换该数组的任何字段值,我已经尝试使用,但它不会成功,因为我需要比较字符串。
以下是我的实现:
replaceObjectAtIndex

-(void)ChkUnChk:(UIButton*)sender {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIButton *btn=(UIButton *)sender;
        NSString *strValue = btn.accessibilityHint;
        NSString *Str=[NSString stringWithFormat:@"%d",(int)btn.tag];
        int iTag = [[sender.layer valueForKey:@"anyKey"] intValue];
        // new Implementation
        NSMutableDictionary *dictFields = [[NSMutableDictionary alloc] init];
        NSMutableArray *arrFieldvalue = [[NSMutableArray alloc] init];
        [dictFields setObject:[[self->dictCustomFieldGroups valueForKey:@"name"] objectAtIndex:iTag] forKey:@"fieldname"];
        [dictFields setObject:[NSString stringWithFormat:@"%ld",(long)iTag] forKey:@"tagvalue"];
        if ([self isTagIDAvailable:iTag]) {
            arrFieldvalue = [[[self->arrTempCheckboxFields objectAtIndex:self->checkboxIndex] valueForKey:@"fieldvalue"] mutableCopy];
            
            BOOL isTheObjectThere = [arrFieldvalue containsObject: strValue];
            if (isTheObjectThere) {
                NSLog(@"string contains");
                [btn setBackgroundImage:[UIImage systemImageNamed:@"square"] forState:UIControlStateNormal];
                for(id item in arrFieldvalue) {
                    if([item isEqual:strValue]) {
                        [arrFieldvalue removeObject:item];
                        [dictFields setObject:arrFieldvalue forKey:@"fieldvalue"];
                        break;
                    }
                }
            } else {
                NSLog(@"string does not contain!");
                [btn setBackgroundImage:[UIImage systemImageNamed:@"checkmark.square"] forState:UIControlStateNormal];
                [arrFieldvalue addObject:strValue];
                [dictFields setObject:arrFieldvalue forKey:@"fieldvalue"];
            }
            NSInteger count = [self->arrFields count];
            for (NSInteger index = (count - 1); index >= 0; index--) {
                NSArray *p = self->arrFields[index];
                if ([[self->arrFields valueForKey:@"tagvalue"] isEqual:[NSNumber numberWithInt:iTag]]) {
                    [self->arrFields removeObjectAtIndex:index];
                }
            }
            
             [self->arrFields replaceObjectAtIndex:iTag withObject:dictFields];
            [self->arrTempCheckboxFields replaceObjectAtIndex:self->checkboxIndex withObject:dictFields];
        } else {
            [btn setBackgroundImage:[UIImage systemImageNamed:@"checkmark.square"] forState:UIControlStateNormal];
            [arrFieldvalue addObject:strValue];
            [dictFields setObject:arrFieldvalue forKey:@"fieldvalue"];
            [self->arrFields addObject:dictFields];
            [self->arrTempCheckboxFields addObject:dictFields];
        }
        NSLog(@"self->arrField: %@",self->arrFields);
    });
}   
-(BOOL) isTagIDAvailable:(int)tagID {
    BOOL retVal = FALSE;
    BOOL tagIdFound = FALSE;
    if ([arrTagID count] > 0) {
        for (int i = 0; i < [arrTagID count]; i++) {
            if ([[NSNumber numberWithInteger:tagID] isEqualToNumber:[arrTagID objectAtIndex:i]]) {
                tagIdFound = TRUE;
                checkboxIndex = i;
                retVal = TRUE;
                break;
            }
        }
        if (!tagIdFound) {
            [arrTagID addObject:[NSNumber numberWithInteger:tagID]];
            checkboxIndex = (int)[arrTagID count];
            retVal = FALSE;
        }
    } else {
        [arrTagID addObject:[NSNumber numberWithInteger:tagID]];
        retVal = FALSE;
    }
    return retVal;
} 

我从第 32 行做了一些事情,比如我将删除该数组值并再次添加它。但我不确定该怎么做。如果需要更多细节,我可以提供。

提前致谢。

ios objective-c nsmutablearray nsmutabledictionary

评论

0赞 trojanfoe 7/8/2020
保存对象数组,而不是字典数组。您会发现这更容易操作。
0赞 Mihir Oza 7/8/2020
在我的场景中@trojanfoe对象数组将很困难。实际上我还没有把我的整个代码放进去。是否有机会在此代码中更改某些内容?
0赞 trojanfoe 7/8/2020
为什么难?无论这是否容易,任何人都可以编程。
0赞 Mihir Oza 7/8/2020
如果你能给我一个在这种情况下的对象数组的例子,那将会有所帮助
0赞 Ol Sen 7/8/2020
提示:只需要包装更改 BTN 的方法调用,否则您将使整个代码在主线程中运行。dispatch_async(dispatch_get_main_queue(),^{});

答: 暂无答案