UIKit状态保存不恢复滚动偏移

Dav*_*eck 8 iphone uikit ios ios6 uikit-state-preservation

我有一个在iOS 6中使用UIKit状态保存的应用程序.我能够保存/恢复视图控制器的状态,即选择了哪个选项卡和导航控制器层次结构,但是我无法获取我的表视图来恢复它的偏移量.我的故事板中有一个用于视图的恢复标识符,以及视图控制器和视图控制器(表的数据源)实现UIDataSourceModelAssociation如下:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

modelIdentifierForElementAtIndexPath:inView:应用程序进入后台时modelIdentifierForElementAtIndexPath:inView:会被调用,但永远不会被调用.

Fab*_*ser 4

这不是您问题的真正答案,但我也无法让表视图恢复其 contentOffset。

我猜这是iOS 6中的一个错误,因为文档明确指出aUITableView恢复其contentOffset,当1)它有一个restorationIdentifier2)视图所属的视图控制器有arestorationIdentifier并且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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么UITableView不自动执行此操作,即使文档说它会自动执行。如果有人知道答案,请评论。