私は同じオブジェクトの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配列とオブジェクトにアクセスできるように、すべてのデータオブジェクトを静的クラスに移動することも考えています(これも可能ですか?)。より良い、または標準的なアプローチがありますか?
申し訳ありませんが、私は少し欲求不満で、ここにはたくさんのことがあります(それ以上の質問があれば、これを持ち出すことはできません)。静的モデルがSwiftで実行可能かどうかを尋ねていますか? (答えは「はい」です)。 MVVMがSwiftで実行可能かどうか尋ねていますか? (また、はい、私は<500文字で行うことができる最高のリンクです)。 SwiftのView Controllerは、通常のMVCアーキテクチャーのモールドに正確に適合しないため、私はMVVMについて尋ねます。 – dylanthelion
フィードバックがありがたいです。私はこの特定の状況で利用可能なより良い解決策があるかどうかを尋ねています。それが私が全体の状況を説明する理由です。私の質問は「これは私が考えたアプローチです。このテキストブロックを改善する方法はありますか? –
私はあなたが望むものを絞る必要があるので、私は 'テキストのブロック'について尋ねています。私の印象は、MyClassの単一のインスタンスが必要なことです。これは、必要なVCに利用できるため、渡す必要はありません。これは正しいです? – dylanthelion