Firebase + Swift:无法删除tableView

时间:2016-09-04 05:04:57

标签: ios swift uitableview firebase firebase-realtime-database

我对编码领域相当新,我正在尝试使用Firebase实现tableView。我想要实现的是:

  1. 使用tableView创建“设置”页面,用户可以在其中输入自己喜欢的位置
  2. 创建表单(我在此处使用Eureka),以便用户从设置页面中输入的收藏夹中选择某些选项
  3. 允许删除那些“收藏夹”
  4. 为了使表单正常工作,我在AppDelegate上提取了由user.uid过滤的Firebase数据。填充这些“收藏夹设置”。当我尝试在'settings'中使用commitEdittingStyle删除行时,它会抛出无效行数的错误。我尝试使用谷歌搜索各种解决方案,并尝试dispatch_async但它不知何故只是不能解决我的问题。我的代码的一些片段如下:

    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',原因:'无效更新:无效   第0节中的行数。包含在中的行数   更新后的现有部分(5)必须等于数量   更新前的该部分中包含的行(5),加号或减号   从该部分插入或删除的行数(插入0,   删除1)加上或减去移入或移出的行数   该部分(0移入,0移出)。'

    请帮助,我已经在这里呆了好几天了。非常感谢。

1 个答案:

答案 0 :(得分: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中找到这些事件的方法。