2017-07-15 9 views
1

私は一度に1つのオブジェクトでいっぱいになるUIViewController(ビューコントローラBを呼び出すことができます)の内部にUITableViewを持っています。オブジェクトは以前のUIViewController(ビューコントローラA)で作成され、ビューコントローラAのprepare(segue:_)関数のテーブルのデータソース(ビューコントローラBでもあります)に追加されます。その時点で、ユーザはコントローラAに戻す「テーブルに追加」セルをタップすることができ、プロセスは繰り返される。問題は、コントローラBを表示するたびにテーブルビューに最後に追加されたオブジェクトしかないことです。これは、それぞれのSegueが移動しているViewControllerの新しいインスタンスを作成しているためです。これを防ぐには、どうやって再インスタンス化されず、毎回空のリストとして上書きされないテーブルビューのデータソースを格納する場所を見つけるのですか?どのようにUIViewControllerがセグの間に再インスタンス化をしないようにするには?

ビューコントローラA

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をBに変数に代入

A:

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は、あなたがセグエをやろうとするたびに再作成されたとき。したがって、データを保持するには、ビューコントローラBからビューコントローラAにデータを戻す必要があります。次に、ビューコントローラAの何かをクリックすると、新しいデータを既存のコントローラに追加してコントローラBに渡す必要があります再び。

データを戻すには、unwind segueを参照する必要があります。 Hereは実装の良い例です。

+0

ああ、実際にViewController自体を再インスタンス化しないようにする効率的な方法はありません。巻き戻しの実装にリンクしてくれてありがとう、私はまだそれらを使用する方法をかなり知りませんでした。 –

0

あなたは、これが各ので起こっていることを正しいですViewControllerBからViewControllerAに戻るとき、ViewControllerBは、そのデータソースと共にメモリから割り当て解除されます。 ViewControllerBprepareForSegueにインスタンス化すると、dataSourceの配列をViewControllerAから渡すことをお勧めします。このような何か...

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 
} 

その方法、ViewControllerAViewControllerBの割り当てが解除された後であっても、選択したすべての項目を追跡しています。

関連する問題