2015-09-25 29 views
2

所以我想通過在Swift中的分支來理解持久性。我有三個文本字段,我們將它們的名稱,日期和位置都放在一個視圖中。我創建了一個雙視圖表單,因此在我收集這些數據點(名稱,日期,位置)之後,我使用一個segue通過添加到第一個視圖的按鈕轉換到下一個視圖。通過分段的持久性

我在下一個視圖中添加了一個返回按鈕以返回到原始視圖(帶名稱,日期,位置字段)。我不明白的是這些領域的價值觀是如何持續存在的。我沒有添加任何委託或與第二個視圖控制器添加任何連接。但是,當我從第二個視圖控制器返回時,值(名稱,日期,位置)將保留在其各自的文本字段中。但是,如果我向第二個視圖控制器文本字段添加一些內容,請返回到第一個視圖控制器,然後向前移動到第二個視圖控制器,第二個視圖中的值不會持續。

class pageOne: UIViewController { 

    @IBOutlet weak var name: UITextField! 
    @IBOutlet weak var location: UITextField! 
    @IBOutlet weak var date: UITextField! 

    override func viewDidLoad() {} 

    @IBAction func nextScreen(sender: UIButton) { 

     if(eventLocation.text != nil){ 
      self.performSegueWithIdentifier("firstSegue", sender: self) 

     } else { 
      let ac = UIAlertController(title: "Invalid Location", message:"Please enter a new location.", preferredStyle: .Alert) 
      ac.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil)) 
      presentViewController(ac, animated: true, completion: nil) 
     } 
    } 
} 



class pageTwo: UIViewController { 


    @IBOutlet weak var firstValue: UITextField! 
    @IBOutlet weak var secondValue: UITextField! 


    override func viewDidLoad() { 
     super.viewDidLoad()  
    } 

    @IBAction func backToStart(sender: UIButton) { 
     self.performSegueWithIdentifier("firstSegueReturn", sender: self) 
    } 
} 

segue是否保持視圖的先前狀態?這就是爲什麼當我通過「firstSegueReturn」返回時,我看到了我在第一個視圖中輸入的值?但是當我從第一個視圖返回到第二個視圖時,爲什麼不保存第二個視圖中的數據?

+0

答案在您的文本中。你繼續尋找新的東西,然後回到你來自的地方。因此,向前推進是一個新的控制器,其內容由您設置爲默認內容或在您的'prepareForSegue'方法中定義。當你回去的時候,你會回到你來自哪裏的所有原始內容。所以想象一下視圖控制器被創建和堆積起來,當你向前延伸並被彈出和扔掉時向後移動。 –

回答

2

所以iOS維護導航堆棧。當您繼續觀看第二個視圖時,第一個視圖仍然位於導航堆棧中,因此它仍保留在內存中。當您從第二個視圖返回到第一個視圖時,第二個視圖將從內存堆棧中彈出,並且不再爲其分配內存。這就是爲什麼當你返回到第二個視圖控制器時,你的值不再存在。

希望能夠解決問題。

+0

你介意接受這個答案嗎?謝謝! –