我有两个表格视图和一个由UINavigationController
管理的详细视图。当在第二个表上选择一行时,它会弹出一个详细视图,允许更改该行所代表的特定数据。我需要能够在UITableView
和UIViewController
之间切换,而不会丢失UIViewControllers中可能已更改的任何数据(按钮选择,在字段中输入的文本值等)。
基本上,一旦呈现UIViewController
,就可以在表和详细视图之间来回切换,而不会丢失任何数据。
问题是,当从导航控制器弹出UIViewController
时,该内存会自动释放,而且由于我正在使用ARC,所以我不能只保留指向{{1 retain
中的命令。
我知道每次选择相应的表行时我都可以手动重建视图,但我觉得这可能是一个混乱的解决方案。我想到的另一个选项是保持一个推送UITableView
数组,并在创建新表之前检查所选表行是否与现有值相对应,但这可能也会变得混乱。
有什么建议吗?
答案 0 :(得分:0)
就像你建议的那样,有几个解决方案。
由于内存问题,阵列解决方案效率很低。
你提出的第二个解决方案更优雅。只需在该视图控制器中编写自己的init方法,并使用plist文件中的数据初始化视图控制器
答案 1 :(得分:0)
您在此视图中的最终愿望就是您在问题中所说的内容:您希望在视图控制器之间切换,而不会丢失在这些控制器中执行的操作的任何信息。 但是,如果您考虑MVC模式的工作原理,您应该将视图控制器视为视图和模型之间的粘合逻辑。视图不是持久性的,这就是为什么ARC在不再需要视图时摆脱拥有的视图控制器是合法的。相反,应用程序工作时应该保留的仅是模型数据:模型数据将在所涉及的视图控制器之间共享,视图控制器将每次重新创建,相应的视图将根据模型数据进行更新。视图控制器应该保持活动状态的唯一原因是它的alloc-init-loadView占用太多时(例如:视图是支持OpenGL的),但在这种情况下,我建议你在AppDelegate中保持对它的强引用要求它在更换模型数据时刷新内容。
基本上你应该做的是: - 选择表格 - 提取与表关联的模型数据,包括与视图控制器相关的所有信息 - 推动视图控制器;保存对模型的所有视图修改 - 弹出视图控制器时,仅返回模型数据 - 下次再次按下视图控制器时,您将恢复模型并重新启动视图控制器。
这种方法并不复杂,让您可以以干净的方式构建应用程序。明天你可以改变你的视图控制器结构(它的视图和逻辑),而不会影响与其他视图控制器的通信,因为这只是通过模型传递。
答案 2 :(得分:0)
如果我正确地阅读了这个问题,你就会得到一个由相同模型数据驱动的tableView和detailView。在详细信息视图中对模型数据进行更改时,您希望这些更改保持不变。
如果在弹出详细信息视图时根据控件的状态更新模型,则这些更改将保持不变,并且下次向下钻取到详细视图时,更改将可见。
您没有提到表格数据的形式,但我们假设它是NSArray
NSMutableDictionaries
。当您点击该行时,didSelectRowAtIndexPath:
方法将需要通过详细控制器上的属性将字典从该数组索引传递到详细视图控制器。详细视图控制器将更新解除它的方法中的字典值。
想到这一点的方法是使用模型 - 视图 - 控制器模式。表格和详细视图数据存储在模型中;观点呈现数据;控制器负责更新模型和在视图之间导航。