2017-07-15 34 views
1

我有一個UITableView裏面的UIViewController(讓我們調用視圖控制器B),我一次填充對象。這些對象是在以前的UIViewController(視圖控制器A)中創建的,並且在視圖控制器A的prepare(for segue:_)函數中添加到表的數據源(也是視圖控制器B)中。這將一個對象添加到該表,在這一點上用戶可以點擊一個「添加到表格」單元格,將它們帶回控制器A,並重復該過程。問題是每次我回到視圖控制器B時,表視圖只有最近添加的對象。我相信這是因爲每個segue都在創建它正在移動的ViewController的新實例。我怎樣才能防止這種情況,或找到一個更好的地方來存儲tableview數據源,每次都不會被重新實例化並被覆蓋爲空列表?如何防止UIViewController在segues期間重新實例化?

視圖控制器等

class ViewControllerA : UIViewController { 

    var object = MyObject(...) 

    ... 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let viewB = segue.destination as! ViewControllerB 


     viewB.dataSource.append(object) // 


    } 
} 

視圖控制器B

class ViewControllerB: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var dataSource = [MyObject]() 

    //DataSource functions fill table with dataSource array objects 
    ... 
} 

回答

0

當您點擊「添加到表」按鈕時,您可以將整個陣列傳遞迴ViewController A.然後,新對象追加到整個列表,它的ViewController乙賦給變量

答:

class ViewControllerA : UIViewController { 

    var dataSource = [MyObject]() // Now you have a dataSource variable in both viewControllers 
    var object = MyObject() 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     let viewB = segue.destination as! ViewControllerB 

     dataSource.append(object) // Add the new object 
     viewB.dataSource = dataSource // Assign the newly-updated array 
    } 
} 

B:

class ViewControllerB: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var dataSource = [MyObject]() 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     let viewA = segue.destination as! ViewControllerA 

     viewA.dataSource = dataSource 
    } 
} 
1

你失去了你的數據的原因是,當視圖控制器B被重建,當你試圖做SEGUE每次。因此,爲了保持數據,您必須將數據從視圖控制器B傳回到視圖控制器A.然後,當您在視圖控制器A上單擊其他內容時,您需要將新數據追加到現有數據,然後傳遞給控制器​​B再次。

要傳回數據,您需要查看unwind segue。 Here是一個很好的實現例子。

+0

嗯,所以確實沒有有效的方法來保持ViewController本身不會重新啓動我猜。感謝您鏈接到unwind實現,我還不知道如何使用這些。 –

0

你是正確的,這種情況正在發生,因爲每個當您從ViewControllerB延續到ViewControllerA時,ViewControllerB會從內存中釋放,連同其數據源。當您在prepareForSegue中實例化ViewControllerB時,我會建議從ViewControllerA通過dataSource數組。事情是這樣的......

class ViewControllerA : UIViewController { 
    var selectedItems: MyObject = [] 
    var object = MyObject(...) 

... 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let viewB = segue.destination as! ViewControllerB 

    viewB.dataSource = selectedItems 
} 

這樣,ViewControllerA是跟蹤所有選定的項目ViewControllerB被釋放後也。

相關問題