2016-07-31 40 views
1

我有一個應用程序,寫在Objective-C,需要顯示數字的UITable。數字列表取自NSMutableArray,其信息來自.plist文件。通常情況下,一切都很好。從NSMutableArray中刪除項目時應用崩潰,但只有當某些條件得到滿足

然而,應用程序包括設置在特定的方式來組織的數字。默認設置只是按字母順序組織它們。下一個組織它們與默認相反。這兩個設置都很好。通過分割奇數和偶數來選擇組織表的設置時會出現問題。這是一個分割它們的代碼:

for (int i = 0; i < [tempGeneralSorterArray count]; i++) 
{ 
    NSString *tempHouseNumber = [[tempGeneralSorterArray objectAtIndex:i] stringByTrimmingCharactersInSet:letters]; 
    int tempHouseNumberValue = [tempHouseNumber intValue]; 

    if (tempHouseNumberValue % 2 == 0) //% is the modulo operator, shows what's left after a division 
    { 
     //even 
     [tempEvenSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]]; 
     [tempEvenSorterArray sortUsingSelector:@selector(compare:)]; 
    } 
    else 
    { 
     //odd 
     [tempOddSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]]; 
     [tempOddSorterArray sortUsingSelector:@selector(compare:)]; 
    } 
} 

在此之後,該應用結合了兩個陣列(tempOddSorterArray和tempEvenSorterArray)在根據設置不同的方式選擇,但一般是這樣的:

customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]; 

表格顯示的很好,但是當我嘗試刪除單元格時,出現錯誤。它崩潰這一行:

[customerArray removeObjectAtIndex:indexPath.row]; 

我得到這個在調試器:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fae62410f30' 

任何幫助,將不勝感激,如果需要我會很樂意提供更多的信息或代碼。

而且,這裏使用的所有陣列NSMutableArrays。

+2

_Also,這裏使用的所有陣列NSMutableArrays._這是錯誤的。至少有一個是不可變的,從例外中可以看出:'__NSArrayI'。 – Avi

+0

@Avi我宣佈我的三個使用陣列(customerArray,tempEvenSorterArray和tempOddSorterArray)在我的.h文件NSMutableArrays ...是否有可能爲它,如果我做錯了什麼以後更改到正規嗎? – JustMe

+2

變量的聲明類型只告訴編譯器你認爲它是什麼。它對實際類型的影響不大。這對於對象來說更是如此,對於類簇和子類,例如'NSArray'和親屬來說更是如此。 – Avi

回答

2

雖然customerArray已被聲明爲可變的,[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]返回一個不可變陣列。嘗試修改它像[[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy];讓我知道它是否會發生。 :)

+0

它實際上工作,非常感謝你!我非常感謝@avi幫助我找到並糾正了另一個無關的問題。從你們兩個人那裏學到很多東西。但是,我不知道它爲什麼從一個可變數組中返回一個不可變數組。有沒有可能發生的原因? – JustMe

+1

歡迎:)。 「arrayByAddingObjectsFromArray」。不會修改調用它的數組,但會返回一個新數組。還有方法名稱本身說,通過添加兩個數組返回一個新數組(不可變數組)。 –

+0

哦,我明白了。我認爲這只是修改它,我不認爲它會完全取代它。感謝您爲我清理。 – JustMe

-1

所以事實證明,

customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]; 

返回一個新NSArray的實例,但不是一個NSMutableArray實例。而你需要一個NSMutableArray類型的實例來調用它的removeObject方法。 您可以通過在收到NSArray後調用方法mutableCopy來實現此目的。這是你如何做到這一點:

customerArray = [[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy]; 

[customerArray removeObjectAtIndex:indexPath.row]; 

你也可以嘗試以下方法,因爲@Droppy聲稱它是更有效的方法,

NSMutableArray * customerArray; 
[customerArray addObjectsFromArray: tempEvenSorterArray]; 
+0

使用'[NSMutableArray addObjectsFromArray:]',因爲它更高效。 – Droppy

+0

@Droppy:好的,但是爲了您的所知,addObjectsFromArray:不是類方法。這是一個實例方法。因此,它應該這樣做:NSMutableArray * customerArray; [customArray addObjectsFromArray:tempEvenSorterArray]; –

相關問題