相关疑难解决方法(0)

UIViewController生命周期调用与状态恢复相结合

我正在尝试在使用iOS 6+和故事板的应用程序中实现状态恢复,但是我在找到防止重量级方法重复调用的方法时遇到了问题.

如果我只是启动应用程序,那么我需要在以下位置设置用户界面viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupUI];
}
Run Code Online (Sandbox Code Playgroud)

这在正常的非状态恢复世界中工作正常.现在我添加了状态恢复,在恢复了一些属性后,我需要用这些属性更新UI:

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    [super decodeRestorableStateWithCoder:coder];
    // restore properties and stuff
    // [...]
    [self setupUI];
}
Run Code Online (Sandbox Code Playgroud)

那么现在发生的事情是首先setupUI调用方法viewDidLoad,然后再调用方法decodeRestorableStateWithCoder:.我没有看到一个我可以覆盖的方法,它始终被称为last.

这是方法调用的正常顺序:

  • awakeFromNib
  • viewDidLoad中
  • viewWillAppear中
  • viewDidAppear

使用状态恢复时,这称为:

  • awakeFromNib
  • viewDidLoad中
  • decodeRestorableStateWithCoder
  • viewWillAppear中
  • viewDidAppear

我无法将调用setupUI放入,viewWillAppear因为每次本机返回视图时它也会被执行.

如果decodeRestorableStateWithCoder被称为BEFORE 会更加方便,viewDidLoad因为那时你可以使用恢复的属性.可悲的是,不是这样,所以...... viewDidLoad当我知道我需要在decodeRestorableStateWithCoder之后重新做一遍时,我怎么能阻止这项工作呢?

state uiviewcontroller ios

10
推荐指数
3
解决办法
3797
查看次数

为什么我的应用程序在恢复后无法返回到我的详细信息视图?

我的应用程序有一个简单的组织,我在Interface Builder故事板中配置(不在代码中).有一个导航视图控制器,其根视图控制器设置为我的主视图控制器.我的主视图包含一个表格,其中单元格转到细节视图控制器.

当我在查看详细信息视图时暂停应用程序然后恢复它时,我将返回主视图,而不是详细信息视图.为什么会这样?

细节:

我在Interface Builder中为导航视图控制器,主视图控制器和详细视图控制器设置了恢复ID.我还尝试在表视图中添加Restoration ID,并使主视图控制器实现UIDataSourceModelAssociation.

我的应用程序从shouldRestoreApplicationState返回YES,主视图和详细信息视图都有encode/decodeRestorableStateWithCoder方法.

我正在使用模拟器测试暂停/恢复:我运行应用程序,导航到详细信息视图,点击主页按钮,然后单击XCode中的停止按钮.要恢复,我正在从XCode再次运行该应用程序.

我在挂起时看到以下调用:

AppDelegate shouldSaveApplicationState
MainViewController encodeRestorableStateWithCoder
DetailViewController encodeRestorableStateWithCoder
Run Code Online (Sandbox Code Playgroud)

在简历上:

AppDelegate shouldRestoreApplicationState
AppDelegate viewControllerWithRestorationIdentifierPath Navigation
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/MainView
MainViewController viewDidLoad
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/DetailView
MainViewController decodeRestorableStateWithCoder
Run Code Online (Sandbox Code Playgroud)

除了正在恢复的错误视图之外,还有其他奇怪之处:为什么详细信息视图的"恢复标识符路径"为"Navigation/DetailView"而不是"Navigation/MainView/DetailView"?导航视图控制器和详细视图控制器之间没有直接关系.它们在Interface Builder中的唯一连接是通过主视图中的segue.

我错误配置了什么吗?

我已经尝试将Restoration Class分配给Detail View.当调用该恢复代码时,它会失败,因为未在编码器中设置UIStateRestorationViewControllerStoryboardKey.

这是我的项目的玩具版本,它复制了这个问题:https://github.com/WanderingStar/RestorationTest

我正在尝试使用XCode版本5.0(5A1413)和iOS模拟器版本7.0(463.9.4),以防这些相关.

xcode objective-c ios state-restoration

2
推荐指数
1
解决办法
2474
查看次数