与 NSUserDefaults 的表情符号比较错误

emoji comparison error with NSUserDefaults

我创建了一个表情符号菜单,用户可以在其中选择它们并在图片之上使用。但是,要使 "recently chosen emoji" 部分正常工作非常困难,因为可能是 NSUserDefaults。当我在 8 个视图中的任何一个中选择一个表情符号时,这个表情符号被添加到一个 NSMutableArray 中,下次我打开表情符号菜单时,这个表情符号是第一个出现在 "recently chosen emoji" 视图中的,正如预期的那样。我实现了以下代码,这样当我选择一个表情符号时(直接通过 "recently chosen emoji view" 或仅通过其他 8 个视图中的任何一个 - 这 9 个视图通过水平滚动视图连接 - 如果这个表情符号已经存在在 "recently chosen emoji view",它从视图中删除并添加到视图的开头)。实际上,我从表情符号数组中的索引中删除,从 "recently chosen emoji" 视图中删除所有子视图,并根据新的表情符号数组用子视图重新填充它:

 - (void)emojiButtonPressed:(UIButton *)button {

     NSLog(@"ARRAY EQUALS = %@", historicEmojiQueue);
     NSLog(@"ARRAY AMOUNT EQUALS = %lu", (unsigned long)[historicEmojiQueue count]);

     if ([historicEmojiQueue count] < 30){

        NSLog(@"Not full");
        for ( int j = 0; j < [historicEmojiQueue count]; j++){
            NSLog(@"IN THE LOOP - START PRINT");
            NSLog(@"%@", button.titleLabel.text);
            NSLog(@"%@", historicEmojiQueue[j]);
            NSLog(@"IN THE LOOP - END PRINT");
            if ( button.titleLabel.text == historicEmojiQueue[j] ){
                NSLog(@"EQUAL ADDITION TO ITEM ALREADY PRESENT");
                [historicEmojiQueue removeObjectAtIndex:j];
            }

        }
        [historicEmojiQueue insertObject:button.titleLabel.text atIndex:0];
    }
    else{
        NSLog(@"Full");
        BOOL equal = NO;
        for ( int j = 0; j < [historicEmojiQueue count]; j++){
           NSLog(@"IN THE LOOP - START PRINT");
           NSLog(@"%@", button.titleLabel.text);
           NSLog(@"%@", historicEmojiQueue[j]);
           NSLog(@"IN THE LOOP - END PRINT");
           if ( button.titleLabel.text == historicEmojiQueue[j] ){
               NSLog(@"EQUAL ADDITION TO ITEM ALREADY PRESENT");
               [historicEmojiQueue removeObjectAtIndex:j];
               equal = YES;
           }
        }  
        if (equal == NO){
            [historicEmojiQueue removeLastObject];
        }
        [historicEmojiQueue insertObject:button.titleLabel.text atIndex:0];
    } 
    NSLog(@"ARRAY EQUALS aF= %@", historicEmojiQueue);
    NSLog(@"ARRAY AMOUNT EQUALS aF= %lu", (unsigned long)[historicEmojiQueue count]);


    [[NSUserDefaults standardUserDefaults] setObject:historicEmojiQueue forKey:@"historicQueue"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    (MORE CODE THAT DOES NOT AFFECT THE PROBLEM)
}

当我选择一个表情符号时,假设比萨,然后选择另外 5 个不同的表情符号,然后再次选择比萨,它完美地工作:比萨从第六个位置删除并添加到第一个。 如果我再次 运行 应用程序,我最后的更改将保存到 NSUserDefaults,因此 Pizza 将是第一个显示在 "recently chosen emoji" 视图上的表情符号。 现在,如果我再次选择 Pizza,旧的 Pizza 和列表中的第一个不会被删除,并且会添加新的,然后在数组的第一和第二位置有两个 Pizza 表情符号,然后,在视图中。 如果我点击视图中的任何旧表情符号(比如第二个披萨),它就会被删除并添加到开头。在 Pizza 的情况下,点击旧 Pizza(第二个位置)不会产生任何可见的变化,因为它们是相等的,但我确信它们交换了位置。这是 ViewDidLoad 中用于从 NSUserDefaults 获取数组的代码:

 NSMutableArray * historicEmojiQueue;
 @implementation myEmojiView

-(instancetype)initWithFrame:(CGRect)frame{
     self = [super initWithFrame:frame];
     if (self) {

         NSMutableArray * permanentQueue = [[NSUserDefaults standardUserDefaults] objectForKey: @"historicQueue"];

          if ( permanentQueue == NULL) {
              historicEmojiQueue =  [[NSMutableArray alloc] init];
              [[NSUserDefaults standardUserDefaults] setObject:historicEmojiQueue forKey:@"historicQueue"];
          }
          else{
              historicEmojiQueue = [[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];
          }
     }
     (MORE CODE)
}

我的问题的原因是第一块代码的打印结果:

ARRAY EQUALS = (
"\Ud83c\Udf55",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf52",
"\Ud83d\Ude18",
"\Ud83d\Ude43",
"\Ud83c\Udfc8",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83d\Ude44",
"\Ud83d\Ude0e",
"\Ud83e\Udd14",
"\Ud83d\Ude12",
"\Ud83d\Ude07",
"\Ud83d\Ude1c",
"\Ud83e\Udd11",
"\Ud83d\Ude17",
"\Ud83d\Ude18",
"\Ud83c\Udf55",
"\Ud83c\Udf2d",
"\Ud83c\Udf56",
"\Ud83c\Udf4f",
"\Ud83c\Udf50",
"\Ud83c\Udf4b",
"\Ud83c\Udf4a",
"\Ud83d\Udc2f",
"\Ud83c\Udf46",
"\Ud83d\Udc3d",
"\Ud83d\Ude4a"
)
ARRAY AMOUNT EQUALS = 30
Full 
IN THE LOOP - START PRINT


IN THE LOOP - END PRINT
IN THE LOOP - START PRINT


IN THE LOOP - END PRINT
.... ( LOTS OF OTHER PRINT STATEMENTS INSIDE LOOP)
ARRAY EQUALS aF= (
"\Ud83c\Udf55",
"\Ud83c\Udf55",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83c\Udf52",
"\Ud83d\Ude18",
"\Ud83d\Ude43",
"\Ud83c\Udfc8",
"\Ud83c\Udf4e",
"\Ud83c\Udf4e",
"\Ud83d\Ude44",
"\Ud83d\Ude0e",
"\Ud83e\Udd14",
"\Ud83d\Ude12",
"\Ud83d\Ude07",
"\Ud83d\Ude1c",
"\Ud83e\Udd11",
"\Ud83d\Ude17",
"\Ud83d\Ude18",
"\Ud83c\Udf55",
"\Ud83c\Udf2d",
"\Ud83c\Udf56",
"\Ud83c\Udf4f",
"\Ud83c\Udf50",
"\Ud83c\Udf4b",
"\Ud83c\Udf4a",
"\Ud83d\Udc2f",
"\Ud83c\Udf46",
"\Ud83d\Udc3d"
)
ARRAY AMOUNT EQUALS aF= 30

如您所见,即使第一个表情符号与第二个表情符号完全相同,无论是打印的还是在它们的 unicode 字符串中,它们都没有通过它们是否相等的检查,就好像它们具有不同的字符串表示形式一样。因为当我没有从 Xcode 再次 运行 应用程序并选择两个相同的表情符号时,它们确实通过了检查并打印 "EQUAL ADDITION TO ITEM ALREADY PRESENT",我确信问题与从 NSUserDefaults 检索的数据有关,即使当我打印从 NSUserDefaults 获得的数组时,它也完全一样。从像 [[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES]; 这样的 NSUserDefaults 复制数组时,我尝试了多种方法,甚至循环遍历 NSUserDefaults 数组复制每个项目,但似乎没有什么可以解决问题。请帮忙! :(

您在

处比较字符串的位置

if ( button.titleLabel.text == historicEmojiQueue[j] )

你应该使用

if ( [button.titleLabel.text isEqualToString:historicEmojiQueue[j]] )

第一个比较是否占用相同内存,第二个比较是否匹配