如何在屏幕上完全重置UITableViewController

时间:2014-08-08 16:35:38

标签: ios objective-c uitableview

在我的应用中,我有一个非常自定义的UITableView。这些单元格在Interface Builder中都是静态定义的,但基于数据结构,表格会以多种方式变形。例如,如果某些数据不存在,则不显示某些单元格(或整个部分),添加自定义分隔线以说明缺少的单元格,将额外的视图加载到单元格中,VoiceOver标签更改等等。因为所有单元格是静态的,我在viewDidLoad中设置了表格布局,因为我当时总是有可用的数据。我总是以模态方式呈现这个视图控制器,它运行良好。如果用户想要在该表中显示不同的数据,则他们必须关闭视图控制器并选择不同的项目再次呈现它,并且在所有情况下都适当地呈现它。

但现在我将其转换为iPad的分割视图控制器,因此UITableViewController永远不会从屏幕上消失,但我需要在用户点击项目时再次设置表格。问题是,因为表永远不会被释放,所以当我向其中加载更多数据时,它的先前布局仍然存在。这将是很多工作(并且很多难以重现弹出错误的机会)来测试所有可能的场景并尝试将其重置回其“pre viewDidLoad状态”或撤消之前的布局更改(如果不再相关) ,如果不是不可能,因为我没有引用生成的许多不同的自定义分隔线。

我的问题是,每次在主视图控制器中选择一行时都可以完全重置表视图控制器,因此允许它正确设置布局,因为它没有卡住与以前的布局?

我基本上需要一些方法来彻底擦除它,好像它从未进行任何设置,然后再次实例化它以使viewDidLoad被调用(或者我可以将该代码移动到它自己的方法或{{1} })。我基本上正在寻找一种方法将viewWillAppear重置为在Interface Builder中定义的方式。

我相信这会导致闪光,因为桌子会完全消失,然后以不同的格式重新出现,但这是可以接受的。如果那可以动画那就好了。如果根本不推荐 ,那么您如何建议我继续确保布局始终适合其呈现的数据?

1 个答案:

答案 0 :(得分:0)

我过度思考这个问题。真的没有必要完全扔掉桌子并生成一个新桌子。结果比我想象的更简单,将表重置回默认状态。必须确保捕获可能发生变化的所有可能的事情,包括VoiceOver标签,并重置为nil或默认值。然后,每次数据更改时,它都可以运行重置代码,然后是布局代码,并呈现适当的布局。最困难的部分是删除自定义分隔线,我通过在创建时将每个分隔线添加到数组中解决,然后通过它进行索引并从其超视图中删除每个分隔线,然后删除与其关联的Autolayout约束。可以将所有这些包装到UIView动画块中以获得漂亮的淡入淡出效果。它工作得很好。