2015-07-21 57 views
0

我的任務對於大多數人來說基本上都很簡單,但顯然我在這裏做錯了什麼。如何呈現空單元格?

我有兩個表視圖控制器,我想根據一些對象狀態來填充它們的單元格。我正在處理核心數據,所以也做fetchResultController

在其中一個視圖控制器中,我可以更改單元格對象的狀態(不是實際的單元格,填充單元格的對象),每當發生這種情況時,我想從表格視圖中刪除此單元格。在該視圖控制器中,我只想呈現填充它們的對象具有status = 0的單元格。但我不想刪除那些被刪除的,只是爲了更改他們的​​,然後在其他視圖控制器中顯示它們,如果他們有status = 1

那麼什麼IM做的是:

每當commitEditingStyle獲取調用:

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

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 

     target.status = @1; 
    } 

    if ([_delegate respondsToSelector:@selector(didDeleteObject)]) { 
     [self fetchData]; 
     [_delegate didDeleteObject]; 
    } 

} 

現在我腦子裏想的是在cellForRowAtIndexPath方法來添加時,即時通訊回這樣的小區的條件:

if ([target.status isEqual:@0]) { 
     return cell; 
    } 
    return NULL; 
} 

,因爲我想提出只有有身份的0細胞...

所以現在顯然我不能進入這個表視圖,因爲我必須在這個方法中返回一個單元格而沒有完成,我怎麼才能說,如果對象目標的雕像不是1,所以不顯示單元格?

其他代碼的解決方案將是巨大的:)

感謝!

回答

0

你應該能夠過濾掉了讀取請求謂詞

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Target"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", [NSNumber numberWithBool:NO]]; 
[fetchRequest setPredicate:predicate]; 

當您將status屬性設置爲1時,FetchedResultsController將自動從tableView中刪除單元格,但該對象不會被刪除。您不必在cellForRowAtIndexPath中做任何事情。在你的其他tableView中,設置謂詞只能獲取status == 1。 另外,請確保在更改屬性值時保存managedObjectContext。

Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 

target.status = @1; 

NSError *error = nil; 
    if (![self.managedObjectContext save:&error]) { 
     NSLog(@"Save Failed! %@ %@", error, [error localizedDescription]); 
    } 
+0

真棒兄弟!這是有效的,只是一件小事 - 當我終止應用程序並再次運行它時,我確實看到與之前刪除的狀態1相同的對象...我在哪裏說我要獲取的狀態爲0 ..? –

+0

@nickshmick很高興工作!它應該在FRC委託方法' - (NSFetchedResultsController *)fetchedResultsController'中。另外,當你刪除時,你保存了'managedObjectContext'嗎?理想情況下,如果設置正確,FRC應該在添加,刪除,更新等時爲您自動更新tableView。檢查這個[教程](http://code.tutsplus.com/tutorials/core-data-from-scratch-nsfetchedresultscontroller--cms-21681)如何使用FRC。這真的很有幫助! – SFF

+0

我在調用viewDidLoad中的fetchData。是的,當我刪除tableView中的對象commitEditingStyle即時做CoreDataStack * stack = [CoreDataStack defaultStack];然後[stack saveContext] –

0

你不能這樣做。

你必須設置一個動態numberOfRowsInSection:,取決於Target多少有status屬性等於@0 所以,在tableView:cellForRowAtIndexPath:你只會如果狀態@0返回小區。

對於我來說,如果將dataSource中的dataSource與target.status = @0等分開,那麼效果會更好。

正確的方式是這樣的

// This is the point where you have an update dataSource array (not splitted) 
updatedDatas = [Manager getLatestData]; 
if (dataSource.count > 0) 
    [dataSource removeAllObjects]; 

[updatedDatas enumerateObjectsUsingBlock:^(Target *obj, NSUInteger idx, BOOL *stop) { 
    if ([obj.status integerValue] == 0) 
     [dataSource addObject: obj]; 
}]; 
updatedDatas = nil; 

// This is the numberOfRowsInSection: 
- (NSInterger)numberOfRowsInSection:(NSInteger)section{ 
    return dataSource.count; 
} 

tableView:cellForRowAtIndexPath:您現在將使用數據源NSMutableArray用一個簡單的objectAtIndex:訪問正確的元素

+0

我想試試你的建議,分裂dataSorce。所以我認爲在viewDidLoad中,我將從fetch結果控制器中獲取狀態爲0的對象,並將它們複製到本地數組調用statusZeroObjects(例如),並在tableView:cellForRowAtIndexPath中使用此數組。但是當我想如果在tableView:cellForRowAtIndexPath方法im從nsfetchresultcontroller獲取對象,我不能只有獲取屬性狀態值爲0的對象嗎? –

+0

您可以不拆分數據源,但是您總是必須檢查數組中的當前元素是否具有'status' = @ 0。我認爲如果你分割一次dataSource,然後使用它,而不總是檢查一個條件是真還是假,那會更好。 –

+0

好的,那麼你可以添加for循環,或者如果有其他方法只複製狀態爲0的對象嗎?我雖然有些東西,但語法是錯誤的。像if(int i = 0; i