2014-05-16 19 views
0

我有一個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方法來繞過我的大腦,並仍然在後臺維護單個謂詞過濾數組。

非常感謝!

回答

0

我已經能夠解決這個問題了,主要是。這是我想出來的東西:

- (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]; 
    NSIndexPath *newIndexPath = [[NSIndexPath alloc] init]; 
    switch (indexPath.section) { 
     case kIncompleteActivitiesSection: { 
      Activity *theActivity = [[_activitiesArray filteredArrayUsingPredicate:_predIncomplete] objectAtIndex:indexPath.row]; 
      [[[_activitiesArray filteredArrayUsingPredicate:_predIncomplete] objectAtIndex:indexPath.row] setValue:@YES forKey:@"isComplete"]; 
      unsigned long newIndex = [[_activitiesArray filteredArrayUsingPredicate:_predComplete] indexOfObject:theActivity]; 
      newIndexPath = [NSIndexPath indexPathForRow:newIndex inSection:kCompleteActivitiesSection]; 
      [self.itineraryTableView beginUpdates]; 
      [self.itineraryTableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; 
      [self.itineraryTableView endUpdates]; 
      break; 
     } 
     case kCompleteActivitiesSection: { 
      Activity *theActivity = [[_activitiesArray filteredArrayUsingPredicate:_predComplete] objectAtIndex:indexPath.row]; 
      [[[_activitiesArray filteredArrayUsingPredicate:_predComplete] objectAtIndex:indexPath.row] setValue:@NO forKey:@"isComplete"]; 
      unsigned long newIndex = [[_activitiesArray filteredArrayUsingPredicate:_predIncomplete] indexOfObject:theActivity]; 
      newIndexPath = [NSIndexPath indexPathForRow:newIndex inSection:kIncompleteActivitiesSection]; 
      [self.itineraryTableView beginUpdates]; 
      [self.itineraryTableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; 
      [self.itineraryTableView endUpdates]; 
      break; 
     } 
     default: { 
      break; 
     } 
    } 
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 
    [self.itineraryTableView reloadData]; 
} 

我不知道,如果運行的循環延遲是一個不錯的選擇,但它是在正確的時間和它看起來很棒。

0

而不是發送reloadData到表視圖,發送一個moveRowAtIndexPath:toIndexPath:消息。

+0

但我如何獲得或生成「to」indexPath爲我的例子? – Kent

+0

更改「isComplete」屬性的值後,根據新值篩選活動數組以獲取目標索引。此時你已經知道它被移動到哪一部分,所以應該是你所需要的。 – jlehr

+0

嗯......我會試着想一想,看看我想出了什麼,但我不確定我可以如何過濾它。 tableview用isComplete == ON返回一個部分的對象,另一部分根據單個支持數組和那些pred來返回OFF。如果我設置屬性,然後過濾,我不知道如何從數組中獲取indexPath - 不indexPath是什麼tableviews生成,而不是數組?我希望我能找到一些這樣的例子,但我沒有太多的運氣。 – Kent

相關問題