2012-03-03 38 views
0

清理完代碼並準備好部署後,我遇到了一個奇怪的問題。當我試圖添加一個聯繫人到我的tableview時,它總是崩潰當數組是空的。之後,沒有問題添加儘可能多的,你想要的。並且當我刪除聯繫人和陣列是空的,它也具有相同的錯誤消息崩潰:當添加第一個項目時(以及刪除最後一個項目時)tableView崩潰

終止應用程序由於未捕獲的異常「NSRangeException」,原因: ' - [__ NSArrayM objectAtIndex:]:索引0超越界限空陣」

這裏是我做的:我通過PHP的聯繫人添加到我的數據庫,使用XML讀出來,並給它返回到應用程序,使用戶可以立即看到發生了什麼(添加一個聯繫人)。有很多代碼涉及到,所以我堅持現在的基礎知識。 當視圖加載數組獲取分配。用戶可以添加聯繫人。在添加聯繫人時,會調用一個php文件,該文件將創建保存聯繫人的xml文件。

這裏就是我得到的對象返回並粘貼到我的數組並顯示它

self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.tabelle count]]; 

self.tableView.scrollEnabled = YES; 

numbers = [[NSMutableArray alloc] init]; 

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSString *fileName = [prefs stringForKey:@"number"]; 
NSString *cc = [prefs stringForKey:@"Code"]; 
NSString *urlString = [NSString stringWithFormat: @"http://myserver/%@%@.xml", cc, fileName]; 
NSURL *url = [NSURL URLWithString: urlString]; 

DataFileToObjectParser *myParser = [[DataFileToObjectParser alloc] parseXMLAtUrl:url toObject:@"contacts" parseError:nil]; 

for(int i = 0; i < [[myParser items] count]; i++) { 
    contacts *new = [[Telefonbuch alloc] init]; 
    new = (contacts *) [[myParser items] objectAtIndex:i]; 
    [numbers addObject:new]; 
    [self.tableView reloadData]; 

這裏是它如何顯示,沒有什麼特別的:

NSString *TableText = [[NSString alloc] initWithFormat:@"%@", [[numbers objectAtIndex:indexPath.row] fname]]; 
NSString *TableText2 = [[NSString alloc] initWithFormat:@"%@", [[numbers objectAtIndex:indexPath.row] lname]];  
NSString *cellValue = [NSString stringWithFormat:@"%@ %@", TableText, TableText2]; 
cell.textLabel.text = cellValue; 
+2

首先,您可能不應該命名變量'new',因爲這是Objective-C++中的關鍵字,而Objective-C中是類方法名稱。其次,通過告訴調試器斷開Objective-C異常,您可以清楚地看到代碼中的問題所在。只要它檢測到異常,調試器就會停止並向您顯示導致問題的堆棧跟蹤。 – user1118321 2012-03-03 15:19:16

+1

我想也是,你可能太晚加載數據。在正確設置之前,您的表格視圖可能會要求數組中的數據。 – Abizern 2012-03-03 16:25:32

+0

感謝你們倆。 @Abizern,這正是發生的事情。 – Blade 2012-03-03 16:43:27

回答

1

你的循環聽起來很奇怪。

for(int i = 0; i < [[myParser items] count]; i++) { 
    contacts *new = [[Telefonbuch alloc] init]; 
    new = (contacts *) [[myParser items] objectAtIndex:i]; 
    [numbers addObject:new]; 
    [self.tableView reloadData]; 

首先避免使用new關鍵字(因爲user1118321已經建議)。

那麼,什麼是contactscontactsTelefonbuch類型的超類嗎?

這兩行代表什麼意思?

contacts *new = [[Telefonbuch alloc] init]; 
new = (contacts *) [[myParser items] objectAtIndex:i]; 

您的alloc-INIT Telefonbuch類的實例爲new(避免這種情況),可變的,但那麼您分配變量到另一個對象。爲什麼?

正確的代碼可能如下所示。

for(int i = 0; i < [[myParser items] count]; i++) { 
    Telefonbuch* newContact = (Telefonbuch*) [[myParser items] objectAtIndex:i]; // or contacts* newContact = (contacts*) [[myParser items] objectAtIndex:i]; 
    // maybe it could be better to rename contacts with a capital letter 
    [numbers addObject:newContact]; 
} 

[self.tableView reloadData]; 

的一些注意事項

如果你想添加或刪除項目表視圖,你需要做的是在2個階段:與您的模型

1)交易

[yourModel removeObjectAtIndex:row]; 

2)處理您的餐桌動畫

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

如果您需要下載內容,也許您可​​以考慮在不阻塞主線程的情況下異步執行此操作。特別是,這可能是可能是阻塞的同步調用(因爲我沒有任何細節,我只是假設它)。

DataFileToObjectParser *myParser = [[DataFileToObjectParser alloc] parseXMLAtUrl:url toObject:@"contacts" parseError:nil]; 

如果你不使用ARC,注重內存管理

希望它有幫助。

相關問題