我試圖從表視圖禁止NSManagedObject。從tableView刪除NSManagedObject並正確地重新加載視圖
我有一個TableView控制器的子類UITableViewController,並擁有一個類型爲myContainer的附加屬性以及一個項目數組。
@property (nonatomic, strong) myContainer * parentContainer;
@property(nonatomic, strong) NSArray * allItems;
myContainer中是一個NSManaged對象,它包含類型myItem的對象的NSSet *:
@interface myContainer : NSManagedObject
@property (nonatomic, strong) NSSet *subItems;
我已經實現刪除功能是這樣的:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSManagedObjectContext *context = [[Catalog sharedCatalog] managedObjectContext];
myItem *selectedItem = [self.parentContainer.subItems allObjects][indexPath.row];
[context deleteObject:selectedItem];
[self viewWillAppear:NO];
[self.view setNeedsDisplay];
}
}
(請注意,指令 [ t deleteObject:selectedItem] 給我一個警告「將'myObject *'發送給類型爲'NSManagedObject '的參數的不兼容指針類型;但我懷疑這是有關什麼如下)
方法viewWillAppear中是這樣的:
- (void)viewWillAppear:(BOOL)animated {
self.allItems = [self.parentContainer.subItems allObjects];
NSLog(@"%lu objects",(unsigned long)[self.allItems count]);
[super viewWillAppear:animated];
[self.tableView reloadData];
}
對於理解發生了什麼我也子類的cellForRowAtIndexPath目的
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// .. //
myItem * selectedItem = self.allItems[indexPath.row];
NSLog(@"%lu : %@",indexPath.row,[selectedItem description]);
}
現在假設我首先加載我的表,它包含3個對象。我收到日誌:
3 objects
0 : item0
1 : item1
2 : item2
我刷卡並刪除第二項。視圖更新但對應的單元不會消失;它只是變空了。日誌內容是這樣的:
3 objects
0 : item0
1 : (null)
2 : item2
現在我做任何事情,這將重新加載的觀點:要麼去上一個視圖,然後回來,去進一步的看法和回來,或刪除第二個對象。然後,一切都很好,如預期的日誌:
2 objects
0 : item0
1 : item2
我所看到的,似乎密切相關的以下兩個問題,但他們沒有收到這似乎解決該問題的任何答案:tablerow delete but still showon in table view和commitEditingStyle: delete data but continue to display row
我也知道有一個更好的方式來抑制細胞調用[tableView deleteRowsAtIndexPath ..](它在這裏工作),但我真的很想理解我得到的輸出和coreData對我後面的對象做的事情回...
我無法理解這裏發生的事情。我在前面的代碼上嘗試了幾個變體,但似乎沒有解決我的問題。
將刪除規則更改爲Cascade。取消僅清除參考。 – Erakk
[context deleteObject]之後,你會[上下文保存]嗎?刪除的對象只會標記爲已刪除,直到您保存上下文爲止。 – CSmith
不,我不這樣做,但爲什麼我改變視圖並回來修改行爲?我的意思是我永遠不會在這個例子中保存。 – vib