2016-09-04 12 views
0

私はコーディングの分野ではかなり新しいですし、FirebaseでtableViewを実装しようとしています。ユーザーから特定のオプションを選択するために、ユーザーが(私はここユーレカを使用)、フォームを入力自分の好きな場所 Firebase + Swift:tableView内の行を削除できません

  • を作成することができますのtableViewを使用して「設定」ページを作成します

    1. :私は何を達成しようとしていることにあります設定ページでは、彼らが入力
    2. フォームが動作するためには、これらの「お気に入り」

    の削除を許可お気に入りは、私がuser.uidによってフィルタリングAppDelegateでFirebaseデータを引き出します。それらの「お気に入り設定」を設定します。 「設定」でcommitEdittingStyleを使用して行を削除しようとすると、無効な行数のエラーがスローされます。私はさまざまなソリューションを試みて、ディスパッチ_アシンクを試してみましたが、どういうわけか、私の問題をかなり解決していません。私のコードのいくつかのスニペットは、次のように:「無効なアップデート:の無効 数

    public var setUpFavLocations: [(String)] = [] 
    public var favLocDatabase: [FIRDataSnapshot]! = [] 
    
    
    @UIApplicationMain 
    class AppDelegate: UIResponder, UIApplicationDelegate { 
    
    var window: UIWindow? 
    var ref: FIRDatabaseReference! 
    var _refHandle: FIRDatabaseHandle! 
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    
        FIRApp.configure() 
    
        let favLocVC: UITableViewController = FavLocationsTableViewController(style: UITableViewStyle.Plain) 
    
    
        ref = FIRDatabase.database().reference() 
    
        if let user = FIRAuth.auth()?.currentUser { 
    
         self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
          favLocDatabase.append(snapshot) 
          let insertionIndexPath = NSIndexPath(forRow: favLocDatabase.count - 1, inSection: 0) 
          favLocVC.tableView.insertRowsAtIndexPaths([insertionIndexPath], withRowAnimation: .Automatic) 
         }) 
    
         self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
          setUpFavLocations.append(snapshot.value?["favLocation"] as! String) 
         }) 
    
    //At FavLocationsTableViewController, aka at the settings page 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
        print("count \(setUpFavLocations.count)") 
        return setUpFavLocations.count 
    } 
    
    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    
        if editingStyle == .Delete { 
    
         if let user = FIRAuth.auth()?.currentUser { 
          let row = favLocDatabase[indexPath.row] 
    
          self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildRemoved, withBlock: { (snapshot) -> Void in 
            favLocDatabase.removeAtIndex(indexPath.row) 
            self.tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: indexPath.row, inSection: 0)], withRowAnimation: .Automatic) 
    
          }) 
          row.ref.removeValue() 
         } 
    
        } 
    } 
    

    はこれが原因、理由キャッチされない例外
    「NSInternalInconsistencyException」に私のアプリを終了、次のエラー

    をスロー行いますupdate(5)後の既存のセクションの に含まれる行数は、更新(5)前にそのセクションに含まれている 行の数にプラスまたはマイナス の行数が挿入されている必要がありますまたはd (0が挿入され、035が挿入され、 が削除されました)、またはそのセクション(0が移動された、0が移動された)の内外に移動された行の数をプラスまたはマイナスします。

    Plsが役に立ったとても有難い。

  • +0

    お待ちください、あなたはユーレカを使用しているとは思わない?ユーレカもここで使ってみませんか?それはずっと簡単です! – Sweeper

    +0

    @ Sweeper私はこの目的に最も適したユーレカのセルを見つけることができません。 – Koh

    +0

    データベースから項目を2回削除することができますか( 'removeAtIndex'と' removeValue')?なぜ、パラメータに渡された(実際には同じ)パスを使用するのではなく、新しいインデックスパスを作成するのですか? – vadian

    答えて

    0

    行を削除するたびに新しいリスナーが作成されますが、これはうまくいかない場合があります。

    self.ref.child("settings").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildRemoved, withBlock: { (snapshot) -> Void in 
        favLocDatabase.removeAtIndex(indexPath.row) 
        self.tableView.deleteRowsAtIndexPaths([NSIndexPath(forRow: indexPath.row, inSection: 0)], withRowAnimation: .Automatic) 
    }) 
    

    を他のリスナーとのあなたのAppDelegateに:

    が移動してみてください。

    また、私はあなたのオブザーバーを扱っていないことに気づいたので、あなたがアプリケーションを開いたり閉じたりすると、オブザーバーは重複します。アプリがバックグラウンドに入ったときにオブザーバーを削除して、アプリがフォアグラウンドに入ったときに再インスタンス化する必要があります。 AppDelegateでこれらのイベントのメソッドを見つけることができます。

    +0

    AppDelegateでindexPathを取得するにはどうすればよいですか? – Koh

    関連する問題