2016-09-04 5 views
0

저는 코딩의 영역에 새로운 경험이 있습니다. Firebase로 tableView를 구현하려고합니다.Firebase + Swift : tableView의 행을 삭제할 수 없습니다.

  1. 사용자가 입력 자신이 좋아하는 위치
  2. 은 (내가 여기 유레카 사용) 사용자가에서 특정 옵션을 선택하기 위해 폼을 만들고 수있는있는 tableView를 사용하여 '설정'페이지 만들기 : 내가 달성하기 위해 시도하고하다 설정 페이지에서 즐겨 찾기 그들은 입력
  3. 은 삭제를 허용 양식이 작동하려면, 내가 user.uid에 의해 필터링 AppDelegate에에서 중포 기지의 데이터를 가져 그 '즐겨 찾기'

위해. '즐겨 찾기 설정'을 채 웁니다. '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 '나에게 응용 프로그램을 종료 다음과 같은 오류

을 던졌습니다 수행 업데이트 (5) 후 기존 섹션에 포함 된 행 수는 업데이트 (5) 이전에 해당 섹션에 포함 된 행 수, 더하기 또는 빼기 삽입 된 행 수와 같아야합니다 또는 d (0은 0으로 이동하고 0은 밖으로 이동했습니다.) 안팎으로 이동 된 행 수를 더하거나 뺍니다. '(0이 삽입 됨, 이 삭제됨)

Pls help, 나는 꽤 오래 여기에 붙어 있습니다. 매우 감사.

+0

잠깐, 유레카를 사용한다고 말하지 않았습니까? 왜 유레카도 여기에 사용하지 않으시겠습니까? 훨씬 쉽습니다! – Sweeper

+0

@Sweeper이 목적에 가장 적합한 유레카 셀을 찾을 수 없습니다. – Koh

+0

데이터베이스에서 항목을 두 번 제거 할 수 있습니까 ('removeAtIndex' 및'removeValue')? 그리고 매개 변수에 전달 된 (실제로는 같은) 경로를 사용하는 대신 새로운 색인 경로를 만드는 이유는 무엇입니까? – vadian

답변

0

행을 삭제할 때마다 새 수신기를 만들므로 좋지 않을 수 있습니다.

시도의 이동 : 다른 청취자와 AppDelegate에에

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에서 이러한 이벤트에 대한 메서드를 찾을 수 있습니다.

+0

AppDelegate에서 indexPath를 얻으려면 어떻게해야합니까? – Koh

관련 문제