首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UICollectionView状态恢复:恢复所有UICollectionViewCells

UICollectionView状态恢复:恢复所有UICollectionViewCells
EN

Stack Overflow用户
提问于 2017-09-22 06:51:23
回答 1查看 358关注 0票数 1

我通过谷歌搜索了很多,所以请原谅我,如果这个问题已经被回答了!

问题:,我有一个有n个UICollectionViewCellsUICollectionView。每个单元格包含来自XIB文件的一个UIView。视图用于数据输入,因此所有单元格都有唯一的reuseIdentifier。每个视图都有一个唯一的restorationIdentifier。一切都在正常使用中工作,但在状态恢复方面却不起作用:

前3或4个单元格恢复正常,因为它们在启动时在屏幕上可见,但其余的单元格(不可访问)没有恢复。

当前解决方案:,因此到目前为止,我发现只有在启动时将视图添加到用户界面时,视图才会被还原。我目前的工作解决方案是在恢复过程中将所有单元格的高度设置为1。现在,每个单元格都被加载,所有视图都被恢复。当调用applicationFinishedRestoringState()时,我用正确的高度重新加载CollectionView。

现在我的问题是:--我对这个解决方案不满意--有更干净的方法来实现所有UIViews的恢复吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-22 11:24:34

我认为您在数据模型和视图之间有点混淆了。当第一次初始化时,您的表视图是从数据模型构造的,它提取存储的值,以便填充每个单元格中的任何内容。但是,用户并不直接与数据模型交互,而是与屏幕上的视图交互。如果用户更改了表视图中的某些内容,则需要向视图控制器发出更改信号,以便它能够记录对数据模型的更改。这就意味着,如果视图需要重新创建,视图控制器就拥有重建应用程序进入后台时表中任何内容所需的信息。

我在这里组装了一个简单的gitHub存储库:https://github.com/mpj-chandler/StateManagementDemo

这包括一个CustomTableViewController类,它管理一个用CustomTableViewCells填充的标准UITableView。自定义单元格包含三个开关按钮,允许用布尔值数组表示每个单元格的状态。

我为单元创建了一个委托协议,这样,如果任何一个开关被绊倒,一个信号将被发送回视图控制器:

代码语言:javascript
复制
protocol CustomTableViewCellDelegate {
    func stateDidChange(sender: CustomTableViewCell) -> Void
}

// Code in CustomTableViewCell.swift:

@objc fileprivate func switched(sender: UISwitch) -> Void {

    guard let index : Int = switches.index(of: sender) else { return }

    state[index] = sender.isOn   
}

// The cell's state is an observed parameter with the following didSet method:

fileprivate var state : [Bool] = Array(repeating: false, count: 3) {
    didSet {
        if state != oldValue, let _ = delegate {
            delegate!.stateDidChange(sender: self)
        }
    }
}

CustomTableViewController被注册到CustomTableViewCellDelegate协议中,以便它能够记录模型中的更改如下:

代码语言:javascript
复制
// Code in CustomTableViewController.swift

//# MARK:- CustomTableViewCellDelegate methods

internal func stateDidChange(sender: CustomTableViewCell) -> Void {
    guard let indexPath : IndexPath = tableView.indexPath(for: sender) else { return }
    guard indexPath.row < model.count else { print("Error in \(#function) - cell index larger than model size!") ; return }

    print("CHANGING MODEL ROW [\(indexPath.row)] TO: \(sender.getState())")
    model[indexPath.row] = sender.getState()

}

您可以在这里看到,该函数被设置为输出对控制台的模型更改。

如果您在模拟器中运行该项目并退出到主屏幕,然后再次返回,您将看到tableView单元格的状态被保留下来,因为模型反映了应用程序进入后台之前所做的更改。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46358508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档