我創建了一個表情符號菜單,用戶可以選擇它們並在圖片上使用。然而,很難讓「最近選擇的表情符號」部分正常工作,因爲NSUserDefaults可能。當我在8個視圖中選擇一個表情符號時,這個表情符號被添加到一個NSMutableArray中,當我下次打開表情符號菜單時,這個表情符號是第一個出現在「最近選擇的表情符號」視圖中的,如預期的那樣。我實現了以下代碼,以便當我選擇表情符號時(直接通過「最近選擇的表情符號視圖」或通過其他8個視圖中的任何一個),9個視圖通過水平滾動視圖連接 - 如果此表情符號已經出現在「最近選擇的表情符號視圖」中,它從視圖中刪除並添加到視圖的開頭)。其實,我是從表情符號數組中的索引中刪除,從「最近選擇的表情符號」視圖中刪除所有子視圖,並根據新的表情符號陣列子視圖重新填充它:表情符號比較錯誤與NSUserDefaults
- (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,所以比薩將成爲在「最近選擇的表情符號」視圖上顯示的第一個表情符號。 現在,如果我再次選擇比薩餅,那麼舊比薩餅和名單上的第一個不會被刪除,並且新的比薩餅將被添加,然後在該數組的第一個和第二個位置有兩個比薩表情符號,然後在視圖中。 如果我點擊視圖中的任何舊emojis(如第二個比薩),它將被刪除並添加到開頭。在比薩餅的情況下,點擊舊披薩(第二位)將不會產生任何明顯的變化,因爲它們是平等的,但我確信它們會交換位置。下面是在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
正如你所看到的,即使第一個表情符號與第二個表情符號完全相同,但它們並沒有通過檢查它們是否相同,就好像它們具有不同的字符串表示形式。由於當我不再從Xcode運行應用程序並選擇兩個相同的表情符號時,它們確實通過了檢查並打印出「等於已存在的項目的附加項」,但我確定問題與從NSUserDefaults檢索到的數據有關,即使打印時我從NSUserDefaults得到的數組完全一樣。從NSUserDefaults複製數組(如[[NSMutableArray alloc] initWithArray:permanentQueue copyItems:YES];
),甚至循環遍歷NSUserDefaults數組複製每個項目,但是沒有任何東西似乎可以解決問題,我嘗試了多種方法。請幫忙! :(
關閉我的頭頂,你應該使用' - [NSString isEqualToString:]'來比較字符串,因爲'=='比較了這種情況下兩個指針是否佔用相同的內存空間。 – diatrevolo
請參閱下面的答案以獲取解釋。 – diatrevolo