2011-03-08 112 views
3

我有一個NSMutableArray一個UITableViewController在這樣的標題:的NSMutableArray removeObjectAtIndex:indexPath.row崩潰

NSMutableArray *someArray; 

我也有屬性聲明:

@property (nonatomic, retain) NSMutableArray *someArray; 

在.m文件我在該方法中加載陣列:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    someArray = [[NSMutableArray alloc] init]; 

    [self loadArrayData]; 

    [tableview reloadData]; 
} 

該表填充很好,添加沒有問題,但w母雞我嘗試刪除一行,以下線的應用程序崩潰:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

    [someArray removeObjectAtIndex:indexPath.row]; 

    //update table etc.. 

如果我使用調試器,我可以看到陣列具有一定的對象,當我登錄indexPath.row我得到的值在數組大小內。

我不明白它爲什麼會崩潰在這條線上......誰能幫助我?

控制檯輸出:

*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因: ' - [__ NSArrayI removeObjectAtIndex:]:無法識別的選擇發送到實例0x6193890'

+1

有關崩潰的更多信息可能會有所幫助。發生了什麼樣的碰撞? – 2011-03-08 20:09:44

+0

對不起,我添加了控制檯錯誤輸出.. – CyberK 2011-03-08 20:12:49

+0

嗯,我真的不知道。很明顯,一個無效的參數被傳遞給removeObjectAtIndex :.但是indexPath.row應該返回一個NSUInteger,它是一個有效的參數。 – 2011-03-08 20:44:24

回答

1

我有同樣的發行一週。我做的是這樣的:

在同一個tableViewController.m實現文件中聲明一個NSMutableArray * globalArray作爲一個全局變量。然後裏面

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    globalArray = [[NSMutableArray alloc] initWithArray:someArray]; 
    [globalArray removeObjectAtIndex:[indexPath row]]; 
} 

然後我在reloadData調用之前將這個globalArray複製回someArray。作品。

+0

嗨。感謝您的回覆!它修復了我正面臨的問題,但現在它在UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]上崩潰了。在tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath任何想法如何解決這個問題? – CyberK 2011-03-08 21:13:08

+3

你不應該用這樣的黑客「修復」你的錯誤。 – 2011-03-08 21:46:53

+0

很棒的回答,@Bourne。謝謝! – Adela 2015-07-16 07:23:15

0
  1. 不知道這引起你的問題之一,但如果你有屬性someArray然後用self.someArray而不只是someArray。 當然,使用的自我,你應該自動釋放它像這樣經過:

self.someArray = [[[NSMutableArray的 頁頭] INIT]自動釋放]。

(稱爲您的viewController init方法內)

然後嘗試:

[self.someArray removeObjectAtIndex:indexPath.row]; 

2. 嘗試調用[self loadArrayData];viewDidLoad。 應該之前的cellForRowAtIndexPath被調用,這樣你就不會需要調用reloadData

如果仍然沒有幫助,然後張貼的loadArrayData

+0

嗨,我會嘗試,當我回家。我爲什麼調用reloadData的問題是因爲我有一個導航控制器,它有一個「添加」按鈕,它將視圖推到一個新的視圖,用戶可以輸入一些細節,當他點擊「保存」時,導航控制器會彈出,那麼它必須重新加載數據,因爲用戶剛剛輸入了一條新記錄......如何在不使用reloadData的情況下完成該操作? – CyberK 2011-03-09 12:22:45

+0

您可以將要更新的數組傳遞給新的viewController並在那裏更新它。當你回到tableViewController時,tableView是不是自己重新加載?不要以爲你需要調用reloadData。 – Idan 2011-03-09 12:45:34

2

我有一個非常類似的問題的代碼和我在開始我的陣列CoreData這樣的:

self.allContacts = (NSMutableArray*)[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

嘗試投放從CoreDataController讀取請求的NSMutableArray結果。

原來我在獲取請求結束時需要名爲「mutableCopy」的函數。

self.allContacts = (NSMutableArray*)[[cdc.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 

我不認爲轉換爲(MutableArray *)是必需的,但我有它以防萬一。

希望這會有所幫助。

+0

請注意,這固定了您所遇到的錯誤。 – c0d3Junk13 2012-10-19 19:29:39