2017-01-06 6 views
0

私はちょうど始まりました。私はUserDefaultsを1回か2回使用しましたが、CoreDataを使用していないので、この状況で使用するかわかりません。私は空の配列からセルが挿入されたテーブルビューを持っています。空の配列には、ページタイトルに応じて文字列の配列が挿入されます。CoreDataとユーザーの削除を保存するためのUserDefaults

つまり、私は、navigationItem.titleを調べるviewDidLoadの関数を持っていて、それが何であるかによって空の配列に正しい文字列を取り込みます。すべてがうまくロードされますが、削除されたアイテムを削除したままにする必要があります。ここに私のコードは次のとおりです。

初期化:

static var places = [String]() 
    var nycPlaces = ["Central Park", "Rockefeller Center", "Empire State Building"] 
    var londonPlaces = ["London Eye", "Windsor Castle", "Tower of London"] 
    var parisPlaces = ["Champs Elysee", "Eiffel Tower", "Catacombs"] 

これは正しい配列を持つテーブルビューを移入する機能である - これはのviewDidLoadに呼び出されます。

func populateCells() { 

    switch navigationItem.title { 
    case "New York": 
     ListController.places = nycPlaces 
    case "London": 
     ListController.places = londonPlaces 
    default: 
     ListController.places = parisPlaces 
    } 

    tableView.reloadData() 
} 

および削除し、私は持っている:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
{ 
    if editingStyle == .delete 
    { 
     tableView.beginUpdates() 
     ListController.places.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .fade) 
     tableView.endUpdates() 
    } 
} 

問題は私がページから離れて移動するときそれ以前に削除された配列に関係なく、空の配列は3つの文字列で再ポピュレートされます。削除されたセルが戻ってこないようにするにはどうすればよいですか?

ありがとうございました!

+1

私は以下の回答に反対し、コアデータ "と呼ばれる。ユーザーのデフォルトをオブジェクト永続性システムとして動作させると、アプリケーションや要件が複雑になるため、時間が無駄になります。 – Paulw11

+0

これは公正なコメント@ Paulw11です。これは本当にあなたがこれと一緒に行くつもりの複雑さに依存します。これらのリストをRESTfulサービスのレスポンスによって作成したい場合や、より多くのタイプの場所やサブリージョンを使用したい場合は、CoreDataをもっと有効なオプションにすることができます。また、CoreDataは関係なく知っておくと良いことです:) – Jake

答えて

0

あなたのアプリが投稿したコード(つまり、一部のリモートサーバーからデータを取得していない、つまり実際にはハードコードされた値)のように単純な場合は、UserDefaultsを使用する必要があります。

CoreDataは急な学習曲線を持ち、使用するのが難しく、正しく使用するのが難しいです。そして、それはあなたが提示したシナリオにとっては残酷です。

また、プロセスを終了して再起動するときにこの値を保持する必要がない場合は、すべてのクラス(たとえば、AppDelegate、グローバルシングルトンクラスなど)からアクセス可能な変更可能な配列を作成し、それらを適所で修正する。

0

これは主に静的なデータなので、CoreDataのオーバーヘッドを防ぐことをお勧めします。代わりに、私はこのアプローチを使用します:

var nycPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "nyc") as? [String] else { 
      return ["Central Park", "Rockefeller Center", "Empire State Building"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "nyc") 
     UserDefaults.standard.synchronize() 
    } 
} 

var londonPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "london") as? [String] else { 
      return ["London Eye", "Windsor Castle", "Tower of London"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "london") 
     UserDefaults.standard.synchronize() 
    } 
} 

var parisPlaces: [String] { 
    get { 
     guard let retval = UserDefaults.standard.object(forKey: "paris") as? [String] else { 
      return ["Champs Elysee", "Eiffel Tower", "Catacombs"] 
     } 

     return retval 
    } set { 
     UserDefaults.standard.set(newValue, forKey: "paris") 
     UserDefaults.standard.synchronize() 
    } 
} 

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
{ 
    if editingStyle == .delete 
    { 
     tableView.beginUpdates() 
     ListController.places.remove(at: indexPath.row) 

     switch navigationItem.title { 
     case "New York": 
      nycPlaces = ListController.places 
     case "London": 
      londonPlaces = ListController.places 
     default: 
      parisPlaces = ListController.places 
     }    

     tableView.deleteRows(at: [indexPath], with: .fade) 
     tableView.endUpdates() 
    } 
} 

P.S. - また、このデータをよりグローバルなスコープで使用し、ナビゲーションアイテムのタイトルに対して文字列比較を行う代わりに列挙型を使用することをお勧めします:)

+0

'synchronize'を呼び出す必要はありません – Paulw11

+0

私はこれを打ちましたが、削除しようとしたときにクラッシュしました:***キャッチされない例外のためにアプリケーションを終了させる 'NSInternalInconsistencyException '、reason:'無効な更新:セクション0の行数が無効です。update(3)の後の既存のセクションに含まれる行の数は、update(3)の前にそのセクションに含まれる行の数に、そのセクションに挿入または削除された行の数をプラスまたはマイナスします、1削除)、そのセクションの内外に移動した行の数をプラスまたはマイナスします(0は移動、0は移動しません)。 – d0xi45

+0

また、私はnavigationItem.titleのラップを解除し、nycPlaces = ListController.placesを逆にしました。 – d0xi45

関連する問題