首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSUserDefaults进行表情符号比较误差

用NSUserDefaults进行表情符号比较误差
EN

Stack Overflow用户
提问于 2016-01-26 18:46:16
回答 1查看 110关注 0票数 0

我创建了一个表情菜单,用户可以选择它们并在图片上使用。然而,很难让“最近选择的表情符号”部分正常工作,因为NSUserDefaults很可能。当我在8个视图中选择一个表情符号时,这个表情符号将被添加到一个NSMutableArray中,下次我打开表情符号菜单时,这个表情符号将像预期的那样第一个出现在“最近选择的表情符号”视图中。我实现了以下代码,以便当我选择一个表情符号时(无论是直接通过“最近选择的表情符号视图”还是通过其他8个视图中的任何一个-这9个视图是通过水平滚动视图连接起来的-如果这个表情符号已经出现在“最近选择的表情符号视图”中,它将从视图中删除并添加到视图的开头)。实际上,我从表情符号数组的索引中删除,删除“最近选择的表情符号”视图中的所有子视图,并根据新的表情符号数组重新填充它的子视图:

代码语言:javascript
复制
 - (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,则不会删除以前的Pizza和列表中的第一个,添加新的,然后在数组的第一个和第二个位置添加两个Pizza表情,然后在视图中。如果我点击视图中的任何一个旧的表情符号(就像第二个比萨饼),它就会被删除并添加到开头。在必胜客的例子中,点击老比萨(第二位置)不会产生任何明显的变化,因为他们是平等的,但我相信他们交换位置。下面是ViewDidLoad中从NSUserDefaults获取数组的代码:

代码语言:javascript
复制
 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)
}

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

代码语言:javascript
复制
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运行应用程序并选择两个相同的表情符号时,它们确实通过检查并打印“对已经存在的项进行同等添加”,因此我确信这个问题与从NSUserDefaults检索数据有关,即使我打印从NSUserDefaults获得的数组时,情况也完全一样。在从NSUserDefaults复制数组时,我尝试过多种方法,比如[[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];,甚至循环遍历NSUserDefaults数组,复制每个项,但是似乎没有什么能解决这个问题。请帮帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-26 18:58:18

中比较字符串的位置

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

你应该用

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

前者比较它们是否占用相同的内存,第二个比较它们是否匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35021454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档