2016-12-31 6 views
1

コードを探しているわけではありませんが、私はこれについてどのようにすべきかを知りたいと思っています。私はブログリーダーのようなアプリを持っています。私はJSONで取り込まれ、jsonArrayに配置され、次にテーブルビューで表示される配列に配置されたMYSQLデータベースに情報を持っています。そのテーブルビューでは、私は一般に1つのセクションにすべてのオブジェクトを持っています。各行/オブジェクトには、クリックするとその行が別のセクションに移動するボタンがあります。私はまた、メインセクション(セクション1)を検索する検索コントローラを持っています。スウィフトのコアデータに関するガイダンス3

どのようにして行の順序や位置をコアデータに保存しますか?

例:セクション0に0行、セクション1に5行、セクション1の行の1つをクリックしてその行をセクション0に移動します。セクション0は1行を持ち、セクション1は4行あります。この新しいテーブルビューオーダーをコアデータに保存するにはどうすればよいですか?私はちょうど行の位置を保存したいので、アプリケーションは、選択された行があったセクションを覚えています。

セクションの行のindexPathを保存しますか? エンティティと属性を追加するときは、どのように保存するのですか?

また、mysqlリーダーでは、tableviewが再読み込みされ、新しいコンテンツが追加されると、tableviewがコアデータから読み込むので、それでも表示されますか?

私はCore Data(Swift 3コード)を学んでいますが、このアプリで使用するのに問題があります。

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

答えて

1

MySQLデータベースからすべてのデータを保存する必要がない場合は、UserDefaultsを使用して注文データを保存します。クラスを定義するだけでデータIDとindexPathが含まれています

class DataOrdering: NSObject, NSCoding { 

    var indexPath: IndexPath? 
    var dataId: String? 

    init(dataId: String, indexPath: IndexPath) { 
     super.init() 
     self.dataId = dataId 
     self.indexPath = indexPath 
    } 

    required init(coder aDecoder: NSCoder) { 

     if let dataId = aDecoder.decodeObject(forKey: "dataId") as? String { 
      self.dataId = dataId 
     } 

     if let indexPath = aDecoder.decodeObject(forKey: "indexPath") as? IndexPath { 
      self.indexPath = indexPath 
     } 

    } 

    func encode(with aCoder: NSCoder) { 
     aCoder.encode(dataId, forKey: "dataId") 
     aCoder.encode(indexPath, forKey: "indexPath") 
    } 

    func save(defaults key: String) -> Bool { 

     let defaults = UserDefaults.standard 
     let savedData = NSKeyedArchiver.archivedData(withRootObject: self) 
     defaults.set(savedData, forKey: key) 
     return defaults.synchronize() 

    } 

    convenience init?(defaults key: String) { 

     let defaults = UserDefaults.standard 
     if let data = defaults.object(forKey: key) as? Data, 
      let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? DataOrdering, 
      let dataId = obj.dataId, 
      let indexPath = obj.indexPath { 
      self.init(dataId: dataId, indexPath: indexPath) 
     } else { 
      return nil 
     } 

    } 

    class func allSavedOrdering(_ maxRows: Int) -> [Int: [DataOrdering]] { 

     var result: [Int: [DataOrdering]] = [:] 
     for section in 0...1 { 
      var rows: [DataOrdering] = [] 
      for row in 0..<maxRows { 
       let indexPath = IndexPath(row: row, section: section) 
       if let ordering = DataOrdering(defaults: indexPath.defaultsKey) { 
        rows.append(ordering) 
       } 
       rows.sort(by: { $0.indexPath! < $1.indexPath! }) 
      } 
      result[section] = rows 
     } 

     return result 

    } 

} 

遊び場サンプル:

let data = DataOrdering(dataId: "1", indexPath: IndexPath(row: 0, section: 0)) 

let savedData = NSKeyedArchiver.archivedData(withRootObject: data) 
let obj = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? DataOrdering 
obj?.dataId // print: "1" 
obj?.indexPath // print: [0,0] 

使用「キー」で保存し、DataOrdering(デフォルト:「キー」)によって、それをリードバックする機能を保存

ビューコントローラの

UPDATED

追加されたコードは、このクラスを使用する:

extension IndexPath { 
    var defaultsKey: String { return "data_ordering_\(section)_\(row)" } 
} 

class ViewController: UITableViewController { 

    var data: [Any]? 
    var items: [[Any]]? 

    func fetchData() { 

     // request from remote or local 
     data = [1, 2, 3, "a", "b", "c"] // sample data 

     // Update the items to first section has 0 elements, 
     // and place all data in section 1 
     items = [[], data ?? []] 

     // apply ordering 
     applySorting() { "\($0)" } 

     // save ordering 
     saveSorting() { "\($0)" } 

     // refresh the table view 
     tableView.reloadData() 

    } 

    func applySorting(_ dataIdBlock: (Any) -> String) { 

     // get all saved ordering 
     guard let data = self.data else { return } 
     let ordering = DataOrdering.allSavedOrdering(data.count) 

     var result: [[Any]] = [[], []] 

     for (section, ordering) in ordering { 
      guard section <= 1 else { continue } // make sure the section is 0 or 1 
      let rows = data.filter({ obj -> Bool in 
       return ordering.index(where: { $0.dataId == .some(dataIdBlock(obj)) }) != nil 
      }) 
      result[section] = rows 
     } 

     self.items = result 

    } 

    func saveSorting(_ dataIdBlock: (Any) -> String) { 

     guard let items = self.items else { return } 

     for (section, rows) in items.enumerated() { 
      for (row, item) in rows.enumerated() { 
       let indexPath = IndexPath(row: row, section: section) 
       let dataId = dataIdBlock(item) 
       let ordering = DataOrdering(dataId: dataId, indexPath: indexPath) 
       ordering.save(defaults: indexPath.defaultsKey) 
      } 
     } 

    } 

    @IBAction func buttonMoveToSectionTapped(_ sender: UIButton) { 

     // if the sender's tag is row index 
     // or you can get indexPath by tableView.indexPath(for: cell) function too 
     let row = sender.tag 

     // move this item from section 1 to section 0 (last position) 
     if let item = items?[1].remove(at: row) { 
      items?[0].append(item) 
     } 

     // Save all sorting 
     saveSorting() { "\($0)" } 

     tableView.reloadData() // refresh table view 

    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return self.items?.count ?? 0 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return self.items?[section].count ?? 0 
    } 


} 
+0

ありがとうございました!何らかの理由でCore Dataが必要だと思っていましたが、正しいですNSUserDefaultsは正しい方法です。なぜならテーブルビューの順序を保存するだけだからです。クイッククエスチョン:あなたが私に示しているコードはindexPathを保存することですが、保存はどのように行われますか?どこのセクションに行を保存するのですか? – BroSimple

+1

コードを追加する答えを更新しました@BroSimple – bubuxu

+0

残念ですが、コードが機能していない、テーブルビューが空になった、saveSorting(){"\($ 0)"} ViewDidLoadでfetchData()を使用しました – BroSimple

関連する問題