2017-02-02 5 views
0

私は同じオブジェクトの3つのコピーを持っているとき私はこれに正しく近づいていないことに気づきました。私は現時点でモデルを説明するために最善を尽くします。簡単にするためにVC =ビューコントローラ冗長データのために私のiOSアプリケーションのために私のソリューションを再構成する必要があります


Tlの; DR:

MainVC -> MapVC -> DetailsVC <- FavoritesVC 
Tab1        Tab2 

MyClass objects consist of a 'favorite' bool flag and a unique id String 
MainVC makes array of MyClass, gives array to MapVC after construction 
MapVC constructs dict mapping Pins to MyClass, user selects pin, corresponding 
    MyClass sent to DetailsVC in segue 
DetailsVC gets copy of MyClass object, displays its details, can mark as favorite 
Since marking as favorite occurs on the copied object, MapVC doesn't realize it's 
    marked as favorite 

それは、MainVCから始まります。これには、MapVCとTableVC(MapVCに焦点を当てます)を切り替えるコンテナビューがあります。 MainVCが応答を分類し、カスタムMyClassのオブジェクトを作成するためにXMLパーサーオブジェクトを使用して

myList //(an array of MyClass) 

にそれらを追加しMapVCもmapListと呼ばれるのMyClassの配列を持っています。 MainVCを更新します。myListを完了すると、それはまた、

mapPage.mapList = myList 

はMapVCは、ユーザーがピンを選択したとき、私はそれがに相当するMyClassを見ることができるように、MyClassのにピンをマップする辞書を持って設定します。

マップは、

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let dest = segue.destinationViewController as? DetailsTableViewController{ 
     dest.myobject = mapList[selectedRow] 
     // selectedRow is correctly set elsewhere, no bugs 
    } 
} 

(単一選択myObjectという知っている)DetailsVCとしてセグエにDetailsVCに選択MyClassのを送り渡す(またはむしろコピー)オブジェクトの詳細が表示されます。これをお気に入りとしてマークすると、オブジェクトのお気に入りのフラグがtrueに設定されます。お気に入りを保存するために、お気に入りとしてマークされたMyClassオブジェクトの辞書をUserDefaultsに保存します。私が見上げると、ユーザがそれらを

var faveArray = [String : MyClass]() 
    if let unarchivedObject = NSUserDefaults.standardUserDefaults().objectForKey(Constants.PreferenceKeys.favorites) as? NSData { 
     faveArray = NSKeyedUnarchiver.unarchiveObjectWithData(unarchivedObject) as! [String : MyClass] 
    } 
    if isFavorite{ 
     faveArray[myobject.id] = myobject 
    } 
    else{ 
     faveArray.removeValueForKey(myobject.id) 
    } 
    defaults.setObject(NSKeyedArchiver.archivedDataWithRootObject(faveArray as NSDictionary), forKey: Constants.PreferenceKeys.favorites) 

FavoritesVC負荷UserDefault辞書をunfavoritesとテーブルビュー内の各myObjectというを示したときにmyObjectsを削除することができますので、私は、配列の代わりに辞書を使用しています。ここでmyObjectを選択することもできます。これは、同じDetailsVCにセグメンテーションを行い、連続して好きなボタンを更新することができます(お気に入りのボタンは即座に更新されますので、好きな場合はunfavoriteに変わります)。

問題はFavoritesVCから何かを彼らはお気に入りから削除するとき、それはMapVC(同じオブジェクト、異なるコピー)に座っているものとは異なるコピーMyClassのオブジェクトですので、あなたが戻ってマップに行くとき、それはまだ言うことです"Unfavorite"。より広い問題は、同じMyClassリスト、3つの辞書、3つの同じMyClassオブジェクト(MapVCでは1、ListVCでは1、FavoritesVCでは1)の3つがあり、これがうまくないことが分かります。

私は、すべてのコントローラが同じMyClass配列とオブジェクトにアクセスできるように、すべてのデータオブジェクトを静的クラスに移動することも考えています(これも可能ですか?)。より良い、または標準的なアプローチがありますか?

+0

申し訳ありませんが、私は少し欲求不満で、ここにはたくさんのことがあります(それ以上の質問があれば、これを持ち出すことはできません)。静的モデルがSwiftで実行可能かどうかを尋ねていますか? (答えは「はい」です)。 MVVMがSwiftで実行可能かどうか尋ねていますか? (また、はい、私は<500文字で行うことができる最高のリンクです)。 SwiftのView Controllerは、通常のMVCアーキテクチャーのモールドに正確に適合しないため、私はMVVMについて尋ねます。 – dylanthelion

+0

フィードバックがありがたいです。私はこの特定の状況で利用可能なより良い解決策があるかどうかを尋ねています。それが私が全体の状況を説明する理由です。私の質問は「これは私が考えたアプローチです。このテキストブロックを改善する方法はありますか? –

+0

私はあなたが望むものを絞る必要があるので、私は 'テキストのブロック'について尋ねています。私の印象は、MyClassの単一のインスタンスが必要なことです。これは、必要なVCに利用できるため、渡す必要はありません。これは正しいです? – dylanthelion

答えて

0

あなたが望むものはシングルトンです。これは一度初期化され、アクセスされると同じインスタンス(同じメモリブロックに格納され、静的インスタンスに相当する)のクラスのインスタンスです。複数のシングルトンパターンがあります。私のコメントで言及したように、私の答えを受け入れずにSwiftのシングルトンについて質問するのは大丈夫です!それは未解決の問題です。MyClassクラスのシングルトンパターンの例を次に示します。

private let mySingleton = MyClass() 

class MyClass { 

    class var shared : MyClass { 
     return mySingleton 
    } 
} 

もちろん、このクラスにプロパティなどを追加します。任意のVCでこのクラスのSAMEインスタンスにアクセスするには、次のコードを使用します。

let globalMyClass = MyClass.shared 

これだけです!明らかに、あなたのクラスとvarに好きな名前をつけてください。また、スウィフトのグローバルバースへの確かなアプローチもあります。今のところこれを使用してください。しかし、時間があれば教えてください。がんばろう!

+0

MyClass.sharedを他のクラスで設定できますか、それとも読み取り専用ですか?あなたのコードで私的に初期化したので、私は尋ねます –

+0

クラスの外に 'プライベートレット'を置くことで、アプリケーションのビルド時に実行され、 'mySingleton'は決して複数回は初期化されません。そのインスタンスはpublicクラスで変更可能なクラスvar 'shared'に公開されています。 – dylanthelion

+0

すべての助けをいただきありがとうございます –

関連する問題