2016-01-26 49 views
0

我創建了一個表情符號菜單,用戶可以選擇它們並在圖片上使用。然而,很難讓「最近選擇的表情符號」部分正常工作,因爲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數組複製每個項目,但是沒有任何東西似乎可以解決問題,我嘗試了多種方法。請幫忙! :(

+1

關閉我的頭頂,你應該使用' - [NSString isEqualToString:]'來比較字符串,因爲'=='比較了這種情況下兩個指針是否佔用相同的內存空間。 – diatrevolo

+0

請參閱下面的答案以獲取解釋。 – diatrevolo

回答

2

您身在何處

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

你應該使用

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

首先比較其是否佔用相同的內存,第二它們是否匹配比較字符串。

+0

謝謝soooo! –