Swift:如何防止未显示的 UITableViewCells 在滚动时被关闭
Posted
技术标签:
【中文标题】Swift:如何防止未显示的 UITableViewCells 在滚动时被关闭【英文标题】:Swift: how to prevent not showed UITableViewCells from being dismissed while scrolling 【发布时间】:2015-09-14 22:45:19 【问题描述】:我有一个包含许多单元格的 UITableViewController,每个单元格都包含一种从用户那里获取的输入(日期选择器、选择器视图、文本字段和文本视图)。当用户完成输入数据后,点击一个正确的按钮来保存所有数据,但问题是我只能从点击按钮时屏幕上可见的单元格中收集数据;前一个和下一个被解雇,它们的内容丢失并且在滚动到表格的那个部分时它们被加载。这样,我将永远无法收集所有数据。有没有办法绕过这件事并防止这些细胞被解雇?或者有没有更聪明的方法来获得我需要的东西?
【问题讨论】:
【参考方案1】:您不应将单元格(视图)设计为负责保存用户的数据。用数据结构来存储,数组呢?
更新: 首先,我很确定这个问题已经有了答案,但我在手机上,所以我不会试图找到它。不过,你会做得很好。
这样想:您无法真正控制何时重用单元格。但是,只要您可以访问单元格上的文本字段(通过插座或使用标签),您只需想办法在它们出现在屏幕上时开始收听它们。
我相信您可以确定在数据源中的哪个位置执行此操作,以及您实际需要多少文本字段侦听器。
【讨论】:
这就是我想要做的,但我只是很难理解一件事:我可以在包含 UITextField 的单元格 swift 类中实现方法 textFieldEditingDidEnd。因此,当用户在单元格内完成键入时,该字符串将存储到字典中的数组 o 中,如您所说。问题是:那么,如果全局数组在表视图控制器类中,我该如何存储该文本? 可能不需要按照您描述的方式在单元格中临时存储任何内容,只要您可以从控制器访问单元格的文本字段。我会在答案中澄清。【参考方案2】:我使用 NSUserDefaults 来存储这样的表单数据。
NSUserDefaults.standardUserDefaults().setObject(value: AnyObject?, forKey: String)
现在你可以通过这种方式获取数据:NSUserDefaults.standardUserDefaults().objectForKey("firstCell")
所以基本上在用户完成输入之后,你 setObject
这将是 textField.text 或 textView.text 属性。然后设置一个键。比如“firstCell”、“secondCell”等。
稍后您可以使用 `objectForKey("firstCell") 获取值
【讨论】:
无需弄乱用户首选项(除非它在这种特定情况下有用)一个简单的Dictionary<NSIndexPath, AnyObject>
在您的数据源中就可以完成这项工作
@YichenBman:这听起来很有趣,但是如果向单元格添加一个键,那么该单元格无论如何都会被关闭。因此,即使我使用该键从该单元格中获取文本,如果该单元格不在显示中,它将为零。也许我从你的回答中遗漏了一些东西......
@Vinzzz 我也在考虑这一点,但我只是难以理解一件事:我可以在包含 UITextField 的单元格 swift 类中实现方法 textFieldEditingDidEnd。因此,当用户在单元格内完成键入时,该字符串将存储到字典中的数组 o 中,如您所说。问题是:那么,如果全局数组在表视图控制器类中,我该如何存储该文本?
好吧,一旦你的数据和你的视图被分开(并且当表格被滚动和单元格被重用时你不会丢失用户编辑),你对你的数据做什么取决于你!您可以使用NSCoding
、CoreData 或任何其他工具来存储它。但至少,您不必阻止用户滚动您的列表...以上是关于Swift:如何防止未显示的 UITableViewCells 在滚动时被关闭的主要内容,如果未能解决你的问题,请参考以下文章
如何防止用户在 Swift 5 的 UITextView 中添加太多换行符?