gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:09:37 24 4
gpt4 key购买 nike

我有一个在 iOS 6 中使用 UIKit 状态保存的应用程序。我能够保存/恢复 View Controller 的状态,即选择了哪个选项卡和导航 Controller 层次结构,但是我无法恢复我的 TableView 这是抵消。我的 Storyboard中有一个用于 View 和 View Controller 的恢复标识符, View Controller (表的数据源)实现了 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];
}

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

最佳答案

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

我猜这是 iOS 6 中的一个错误,因为文档明确指出 UITableView 恢复其 contentOffset,当 1) 它有一个 restorationIdentifier 2) View View 所属的 Controller 具有 restorationIdentifier 和 3) 数据源符合 UIDataSourceModelAssociation 协议(protocol)。

不过,您可以在 View Controller 中手动恢复 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 不会自动执行此操作,即使文档说它会自动执行。如果有人知道答案,请发表评论。

关于iphone - UIKit 状态保存不恢复滚动偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com