我有两个ViewController,每个都有一个TextField来获取用户输入数字和两个按钮来进行计算和导航。
用户在填充TextField时会在SecondVC中创建TextField的实例,该实例存在并且在视图中显示
问题是:当您在创建对象-单元格后离开SecondView控制器时,稍后再返回时,它被设置回cero,而不是实例-单元格值
class MainViewController: UIViewController {
@IBOutlet weak var A3TextField: UITextField!
@IBAction func calc(_ sender: Any) {
let A3 = Cell(name: "A3", sheet: "", value: Double(A3TextField.text!)!)
print(A3)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
}
class SecondViewController: UIViewController {
@IBOutlet weak var B3TextField: UITextField!
@IBAction func calc2(_ sender: Any) {
let B3 = Cell(name: "B3", sheet: "", value: Double(B3TextField.text!)!)
print(B3)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
struct Cell {
var name: String = ""
var sheet: String = ""
var value: Double = 0
init(name: String, sheet: String, value: Double) {
self.name = name
self.sheet = sheet
self.value = value
}
}
最佳答案
当控制器弹出或推入时,它们的临时属性值或对象不能保存到其他控制器中,甚至不能保存到其他控制器中,当推入和返回时,它们是初始值,如果要在页面切换时保存值,建议以下解决方案:
1.传递抛出属性值(一个=>两个)
OneViewController:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let twoVC = storyboard.instantiateViewController(withIdentifier: "TwoViewControllerID") as! twoViewController
twoVC.myStr="Controller one to controller two!"
self.present(twoVC, animated: true, completion: nil)
TwoViewController
var myStr=String()
override func viewDidLoad() {
super.viewDidLoad()
print("get value:\(myStr)"
}
2,使用NSUerDfault保存并获取
设定值:
let userDefault = UserDefaults.standard
userDefault.set(name, forKey: "name")
userDefault.synchronize()
GetValue:
let userDefault = UserDefaults.standard
let name = userDefault.object(forKey: "name") as? String
3,storybord通过值(一=>二)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let theSegue=segue.destination as! twoViewController theSegue.myStr="other pass way" }
4,删除通过值(两个=>一个)
基于唐回到首页
TwoViewController:
//(1)create a delegate before class
protocol FTVCdelegte : NSObjectProtocol{
//define method
// one method
func change(title:String)
//two method
func ChangeColoer (Coloer:UIColor)
//three method
func ChangSucces(YON:Bool)
}
//(2)create delegate object。
var delegate_zsj:FTVCdelegte?
//(3)click back button
@IBAction func backBtnAction(_ sender: UIButton) {
delegate_zsj?.change(title: "main page")
delegate_zsj?.ChangeColoer(Coloer: UIColor.red)
delegate_zsj?.ChangSucces(YON: true)
self.navigationController?.popViewController(animated: true)
}
OneViewController
//(4)inherit delegate:
class SecondViewController: UIViewController,FTVCdelegte,ChangeBtnDelege{
...
//(5)imple delegate method
func change(title: String) { self.title = title }
func ChangeColoer(Coloer: UIColor) { self.view.backgroundColor = Coloer }
func ChangSucces(YON: Bool) { print(YON) }
//(6)when pop page use
@IBAction func tiaozhuanBtnAction(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let oneVC = storyboard.instantiateViewController(withIdentifier: "OneViewControllerID") as! oneViewController
oneVC.delegate_zsj = self
self.navigationController?.pushViewController(oneVC, animated: true)
}
5,阻止通过值(两个=>一个)
基于唐回到首页
TwoViewController:
//(1)define a block method:
var bbchange:((_ title:String,_ myColor:UIColor)->Void)?
//(2)back to front page:
@IBAction func backBtnAction(_ sender: UIButton) {
bbchange?("document",UIColor.green)
self.navigationController?.popViewController(animated: true)
}
OneViewController
//(3)next page invoke block method
@IBAction func tiaozhuanBtnAction(_ sender: Any) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let threeVC = storyboard.instantiateViewController(withIdentifier: "twoViewControllerID") as! twoViewController
twoVC.bbchange=
{
( title:String,myColor:UIColor) in
self.title=title
self.view.backgroundColor=myColor
}
self.navigationController?.pushViewController(twoVC, animated: true)
}
关于ios - 在Swift中导航时,TextField会卸载值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52878509/