我创建了一个表情菜单,用户可以选择它们并在图片上使用。然而,很难让“最近选择的表情符号”部分正常工作,因为NSUserDefaults很可能。当我在8个视图中选择一个表情符号时,这个表情符号将被添加到一个NSMutableArray中,下次我打开表情符号菜单时,这个表情符号将像预期的那样第一个出现在“最近选择的表情符号”视图中。我实现了以下代码,以便当我选择一个表情符号时(无论是直接通过“最近选择的表情符号视图”还是通过其他8个视图中的任何一个-这9个视图是通过水平滚动视图连接起来的-如果这个表情符号已经出现在“最近选择的表情符号视图”中,它将从视图中删除并添加到视图的开头)。实际上,我从表情符号数组的索引中删除,删除“最近选择的表情符号”视图中的所有子视图,并根据新的表情符号数组重新填充它的子视图:
- (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获取数组的代码:
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运行应用程序并选择两个相同的表情符号时,它们确实通过检查并打印“对已经存在的项进行同等添加”,因此我确信这个问题与从NSUserDefaults检索数据有关,即使我打印从NSUserDefaults获得的数组时,情况也完全一样。在从NSUserDefaults复制数组时,我尝试过多种方法,比如[[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];
,甚至循环遍历NSUserDefaults数组,复制每个项,但是似乎没有什么能解决这个问题。请帮帮忙!
发布于 2016-01-26 10:58:18
中比较字符串的位置
if ( button.titleLabel.text == historicEmojiQueue[j] )
你应该用
if ( [button.titleLabel.text isEqualToString:historicEmojiQueue[j]] )
前者比较它们是否占用相同的内存,第二个比较它们是否匹配。
https://stackoverflow.com/questions/35021454
复制