gpt4 book ai didi

ios - 与 NSUserDefaults 的表情符号比较错误

转载 作者:行者123 更新时间:2023-11-28 21:33:09 25 4
gpt4 key购买 nike

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

 - (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 将是第一个显示在“最近选择的表情符号” View 中的表情符号。 现在,如果我再次选择 Pizza,旧的 Pizza 和列表中的第一个不会被删除,并添加新的,然后在数组的第一和第二位置有两个 Pizza 表情符号,然后,在查看。如果我点击 View 中的任何旧表情符号(比如第二个披萨),它就会被删除并添加到开头。在 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)
}

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

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 数组复制每个项目,但似乎没有什么可以解决问题。请帮忙! :(

最佳答案

比较字符串的位置

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

你应该使用

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

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

关于ios - 与 NSUserDefaults 的表情符号比较错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35021454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com