我一直在玩 iOS 6 状态保存/恢复,但遇到了一个奇怪的情况。如果我在 Storyboarded 应用程序的导航控制器中嵌入了一个表格视图控制器,表格视图(即使在我向下滚动之后)在我测试状态恢复后将其滚动位置重置为顶部(使用“按下主页按钮,然后停止和在 Xcode 中运行”例程)。这是为 iOS 6.0 构建的 Xcode 4.5.1。
我已经执行了支持恢复所需的步骤:我已经检查了在我的表视图控制器子类中调用了 encodeRestorableStateWithCoder 和 e encodeRestorableStateWithCoder(是的,我在运行该检查时确实调用了 super)。
如果我从情节提要中删除导航控制器,而是将我的表格视图控制器嵌入到选项卡栏控制器中,则滚动位置将被保留。
知道我可能做错了什么吗?(我倾向于认为这是一个错误。)
以下是重现此问题的确切步骤(适用于 Xcode 4.5.1、iOS 6.0)
使用启用了 ARC 的空模板创建一个新的 iPhone 项目。
创建一个名为 Storyboard 的故事板文件,并在 Project Editor > Targets > Summary 窗格中将其设置为应用程序的“Main Storyboard”
将导航控制器拖到情节提要场景中
(4)在Appdelegate.m中,将@implementation部分的代码替换为阅读
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}
- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}
(5)创建一个不带XIB的UITableViewController子类,命名为TableViewController,将.m文件中的代码替换为:
#import "TableViewController.h"
@implementation TableViewController
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1000;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
return cell;
}
(6) 在 Storyboard 中,在实用程序窗格的 Identity Inspector 中,将表视图控制器的类从 UITableViewController 更改为 TableViewController。
(7) 在 Storyboard 中,通过 Attributes Inspector 将单元重用标识符“Cell”分配给表格视图单元。
(8) 在 Storyboard 中,将 Restoration ID 分配给导航控制器、表格视图控制器和 Identity Inspector 中的表格视图。我将 Storyboard ID 分别设置为“Nav Controller”、“Table View Controller”和“Table View”,并选中“Use Storyboard ID”复选框作为每个的恢复 ID。
构建应用程序,向下滚动表格视图,单击主页按钮,在 Xcode 中停止应用程序,然后通过 Xcode 再次运行。
表格视图应该滚动到按下主页按钮之前的位置,但事实并非如此。