从 swift 中的模态返回后如何保留文本字段值?
How to keep text fields values after returning from modal in swift?
我想知道当应用程序转至模态并 return 转至同一页面时,如何保留文本字段输入数据?
场景:我有一个带有文本字段和按钮的注册页面,其中一个按钮连接到表示为模态的视图控制器。模态内部有一个 table 视图,当用户单击它的单元格时 returns 数据,并将用户发送回注册页面,但字段为空。
最好的方法是什么?
我想到的唯一解决方案是使用 NSDefaults,不确定它是否是一个好方法。
澄清:
我通过添加一个普通的 viewController 在故事板中完成了模态。
然后我在 Button 和新的 viewController 之间连接了一个 segue,并选择了 present modally。
我为模式 "ModalVC" 指定了一个 class,它具有 table 查看数据源和委托函数。
然后我在 table 单元格(ModalVC 中的单元格)与注册页面之间创建了另一个 segue 以发送回数据。
谢谢
在这种情况下使用 NSUserDefaults
会奏效。你必须做几件事:
- 实例化一个
NSUserDefaults
实例
- 当您第一次打开注册页面时,对于每个文本字段
title
,检查是否有字符串存储在 title
的默认值中(使用 defaults.valueForKey("key")
)
- 如果是
nil
,则在prepareForSegue
函数中使用defaults.setValue(value, forKey: "field name")
存储每个字段中的值(换句话说,就在模态视图出现之前)
- 如果不是
nil
,则加载默认 中每个字段存储的值
- 注册完成后,将默认设置重置为
nil
希望这对您有所帮助:)
对于可能偶然发现这个问题的未来读者,虽然上面的 Mr.Mike Schmidt 答案肯定有效,但是当你有太多文本字段要存储在默认值中时,处理起来会太复杂,因此也许多检查、存储和重置,这将使应用程序逻辑变得非常乏味和难以跟踪。
我建议您按照我所做的以下解决方案:
(供参考:我的 Modalvc 是一个显示项目列表的 TableView)
1- 在情节提要中,按住 Ctrl 键从 registrationvc 拖动到 modalvc,然后 select "present as modal" segue
2- 将 modalvc 值存储到默认值 中,而不是将文本字段值存储到默认值中(因为它只有一个值,您将以一个默认值结束)像这样:
像这样实例化默认值:
let defaults = NSUserDefaults.standardUserDefaults()
用您的数据填充 TableView 后,将 selected tableview 单元格数据存储在默认值中,如下所示:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = MyTable.cellForRowAtIndexPath(indexPath)
let MyValue = cell?.textLabel?.text
defaults.setObject(MyValue, forKey: "SelectedValueKey")
//this line will make your life easy
self.dismissViewControllerAnimated(true, completion: nil)
}
3- 这是重要的部分,而不是从 TableViewCell 到 registrationvc 的 segue 只是简单地做一个 dismissViewControllerAnimated => 这将只需关闭 modalvc 而不重置 TextFields,
注意上面代码中的一行:
self.dismissViewControllerAnimated(true, completion: nil)
4- 现在回到您的注册vc 检查是否存在默认值:
if defaults.valueForKey("SelectedValueKey") != nil{
let SelectedValue = (defaults.objectForKey("SelectedValueKey") as? String)!
print(SelectedValue)
data.append(SelectedValue)
}
5- 当用户点击提交按钮时不要忘记重置默认值,或者如果您有取消按钮,请忘记重置默认值。
defaults.removeObjectForKey("SelectedValueKey")
尽情享受吧!
我想知道当应用程序转至模态并 return 转至同一页面时,如何保留文本字段输入数据?
场景:我有一个带有文本字段和按钮的注册页面,其中一个按钮连接到表示为模态的视图控制器。模态内部有一个 table 视图,当用户单击它的单元格时 returns 数据,并将用户发送回注册页面,但字段为空。
最好的方法是什么? 我想到的唯一解决方案是使用 NSDefaults,不确定它是否是一个好方法。
澄清:
我通过添加一个普通的 viewController 在故事板中完成了模态。 然后我在 Button 和新的 viewController 之间连接了一个 segue,并选择了 present modally。
我为模式 "ModalVC" 指定了一个 class,它具有 table 查看数据源和委托函数。
然后我在 table 单元格(ModalVC 中的单元格)与注册页面之间创建了另一个 segue 以发送回数据。
谢谢
在这种情况下使用 NSUserDefaults
会奏效。你必须做几件事:
- 实例化一个
NSUserDefaults
实例 - 当您第一次打开注册页面时,对于每个文本字段
title
,检查是否有字符串存储在title
的默认值中(使用defaults.valueForKey("key")
) - 如果是
nil
,则在prepareForSegue
函数中使用defaults.setValue(value, forKey: "field name")
存储每个字段中的值(换句话说,就在模态视图出现之前) - 如果不是
nil
,则加载默认 中每个字段存储的值
- 注册完成后,将默认设置重置为
nil
希望这对您有所帮助:)
对于可能偶然发现这个问题的未来读者,虽然上面的 Mr.Mike Schmidt 答案肯定有效,但是当你有太多文本字段要存储在默认值中时,处理起来会太复杂,因此也许多检查、存储和重置,这将使应用程序逻辑变得非常乏味和难以跟踪。
我建议您按照我所做的以下解决方案:
(供参考:我的 Modalvc 是一个显示项目列表的 TableView)
1- 在情节提要中,按住 Ctrl 键从 registrationvc 拖动到 modalvc,然后 select "present as modal" segue
2- 将 modalvc 值存储到默认值 中,而不是将文本字段值存储到默认值中(因为它只有一个值,您将以一个默认值结束)像这样:
像这样实例化默认值:
let defaults = NSUserDefaults.standardUserDefaults()
用您的数据填充 TableView 后,将 selected tableview 单元格数据存储在默认值中,如下所示:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let cell = MyTable.cellForRowAtIndexPath(indexPath) let MyValue = cell?.textLabel?.text defaults.setObject(MyValue, forKey: "SelectedValueKey") //this line will make your life easy self.dismissViewControllerAnimated(true, completion: nil) }
3- 这是重要的部分,而不是从 TableViewCell 到 registrationvc 的 segue 只是简单地做一个 dismissViewControllerAnimated => 这将只需关闭 modalvc 而不重置 TextFields,
注意上面代码中的一行:
self.dismissViewControllerAnimated(true, completion: nil)
4- 现在回到您的注册vc 检查是否存在默认值:
if defaults.valueForKey("SelectedValueKey") != nil{
let SelectedValue = (defaults.objectForKey("SelectedValueKey") as? String)!
print(SelectedValue)
data.append(SelectedValue)
}
5- 当用户点击提交按钮时不要忘记重置默认值,或者如果您有取消按钮,请忘记重置默认值。
defaults.removeObjectForKey("SelectedValueKey")
尽情享受吧!