我有一個UITableView有兩個部分。每個部分的數據源都是使用謂詞確定其內容的單個數組。我這樣做是因爲數組中有其他對象,我不想在表中顯示,但是一旦用戶完成表格的播放(它是交互式的),就需要能夠保存回Core Data。如何在使用謂詞的UITableView中的部分之間移動對象?
交互之一是單擊單元格上的開關,該單元在填充該行的對象上設置屬性。該特定的屬性決定了對象顯示在哪個部分。下面是我現在的做法:
編輯:添加了viewWillLayoutSubviews代碼以顯示謂詞是如何生成的。
- (void)viewWillLayoutSubviews {
// read and sort initial activities
_activitiesSet = [_theEvent mutableSetValueForKey:@"activities"];
_activitiesArray = [[_activitiesSet allObjects] mutableCopy];
_predIncomplete = [NSPredicate predicateWithFormat:@"(isHidden == NO) AND (isComplete == NO)"];
_predComplete = [NSPredicate predicateWithFormat:@"(isHidden == NO) AND (isComplete == YES)"];
}
- (IBAction)completeSwitchTapped:(id)sender {
UIView *currentSuperview = [sender superview];
while (![currentSuperview isKindOfClass:[UITableViewCell class]] && [currentSuperview superview] != nil) {
currentSuperview = [currentSuperview superview];
}
NSIndexPath *indexPath = [self.itineraryTableView indexPathForCell:(UITableViewCell *)currentSuperview];
switch (indexPath.section) {
case kIncompleteActivitiesSection:
[[[_activitiesArray filteredArrayUsingPredicate:_predIncomplete] objectAtIndex:indexPath.row] setValue:@YES forKey:@"isComplete"];
break;
case kCompleteActivitiesSection:
[[[_activitiesArray filteredArrayUsingPredicate:_predComplete] objectAtIndex:indexPath.row] setValue:@NO forKey:@"isComplete"];
break;
default:
break;
}
[self.itineraryTableView reloadData];
}
這工作得很好,但沒有動畫。當我點擊一行中的開關時,它從它的部分中消失並出現在另一箇中(由於reloadData)。這真的不是很優雅。
如何爲離開一個部分並滑入另一部分的行創建動畫?
我似乎無法圍繞我如何制定deleteRowsAtIndexPaths和addRowsAtIndexPaths方法來繞過我的大腦,並仍然在後臺維護單個謂詞過濾數組。
非常感謝!
但我如何獲得或生成「to」indexPath爲我的例子? – Kent
更改「isComplete」屬性的值後,根據新值篩選活動數組以獲取目標索引。此時你已經知道它被移動到哪一部分,所以應該是你所需要的。 – jlehr
嗯......我會試着想一想,看看我想出了什麼,但我不確定我可以如何過濾它。 tableview用isComplete == ON返回一個部分的對象,另一部分根據單個支持數組和那些pred來返回OFF。如果我設置屬性,然後過濾,我不知道如何從數組中獲取indexPath - 不indexPath是什麼tableviews生成,而不是數組?我希望我能找到一些這樣的例子,但我沒有太多的運氣。 – Kent