2012-11-28 33 views
8

我有一個使用的UIKit狀態保存在IOS 6.我能夠保存/恢復視圖控制器的狀態,其中標籤被選中和導航控制器層次結構中的應用程序,即,但是我無法讓我的表格視圖恢復它的偏移量。我在我的故事板的視圖恢復標識符以及視圖控制器和視圖控制器(該表的數據源)實現UIDataSourceModelAssociation如下:UIKit的狀態保存不恢復滾動偏移

- (NSString *)modelIdentifierForElementAtIndexPath:(NSIndexPath *)indexPath inView:(UIView *)view 
{ 
    TSStatus *status = [self._fetchedResultsController objectAtIndexPath:indexPath]; 

    return status.objectID.URIRepresentation.absoluteString; 
} 

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 

modelIdentifierForElementAtIndexPath:inView:獲取調用時,應用程序進入後臺,但是modelIdentifierForElementAtIndexPath:inView:永遠不會被調用。

+1

我假設你的結束段落是一個錯字? ---「modelIdentifierForElementAtIndexPath:inView:在應用程序進入後臺時調用,但是modelIdentifierForElementAtIndexPath:inView:永遠不會被調用。」導航控制器中的 – Daniel

回答

2

這是不是一個真正的回答你的問題,但我還沒有能夠得到一個表視圖恢復其contentOffset,無論是。

我想這是在IOS 6中的錯誤,因爲在文檔中明確指出,一個UITableView恢復其contentOffset,1)它具有視圖屬於restorationIdentifier 2)視圖控制器時具有restorationIdentifier和3)數據源符合UIDataSourceModelAssociation協議。

您可以在視圖控制器手動還原contentOffset和所選擇的項目,但:

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 

    [coder encodeObject:[NSValue valueWithCGPoint:self.tableView.contentOffset] forKey:@"tableView.contentOffset"]; 

    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    if (indexPath != nil) { 
     NSString *modelIdentifier = [self modelIdentifierForElementAtIndexPath:indexPath inView:self.tableView]; 
     [coder encodeObject:modelIdentifier forKey:@"tableView.selectedModelIdentifier"]; 
    } 
} 

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super decodeRestorableStateWithCoder:coder]; 

    CGPoint contentOffset = [[coder decodeObjectForKey:@"tableView.contentOffset"] CGPointValue]; 
    self.tableView.contentOffset = contentOffset; 

    NSString *modelIdentifier = [coder decodeObjectForKey:@"tableView.selectedModelIdentifier"]; 
    if (modelIdentifier != nil) { 
     NSIndexPath *indexPath = [self indexPathForElementWithModelIdentifier:modelIdentifier inView:self.tableView]; 
     if (indexPath != nil) { 
      [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
     } 
    } 
} 

我不知道爲什麼UITableView沒有自動做到這一點,即使文件說,它的作用。如果有人知道答案,請評論。

3

我發現這可以工作,如果UITableView 有一個restoreIdentifier集。

但是,如果UITableViewController位於UINavigationController中,則它不起作用。這已經報告給蘋果,問題ID:13536778.此問題上似乎不論是iOS 6.0和6.1.3發生。

+0

表:看起來仍然是iOS9中的一個錯誤 – Jaro

2

這是iOS中的錯誤6.

要獲得狀態恢復爲你的表視圖使用UIDataSourceModelAssociation協議,你應該叫你的表視圖-reloadData-indexPathForElementWithModelIdentifier:inView:像這樣返回有效的索引路徑前的工作:

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    [self.tableView reloadData]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 
+0

感謝您的支持! –

+0

此錯誤似乎在iOS 7中得到修復。我不再需要調用reloadData來恢復表視圖的狀態。 – bilobatum