簡體   English   中英

無法重新加載UITableView

[英]Can't reload UITableView

我正在嘗試設計View,以便在其中顯示與Firebase數據庫同步的元素。 每當數組中的元素更改時,它都會重復。 嘗試使用

self.tableView.reloadData()

但沒有任何變化。 也嘗試過

self.tableView.beginUpdates()
self.tableView.reloadRowsAtIndexPaths(NSArray.init(object: indexPath) as! [NSIndexPath], withRowAnimation: .Automatic)
self.tableView.endUpdates()

而且它沒有像以前那樣工作。 我嘗試使用功能在主線程中執行重新加載tableView失敗

performSelectorOnMainThread

我正在為你們發布我的代碼,以便有人可以幫助我。 我是iOS編程的新手,我不知道何時在tableView中重新加載數據。 即使閱讀了蘋果的文檔。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let alert = UIAlertController(title: "Akcja", message: "Wybierz akcję", preferredStyle: .ActionSheet)

    let changeFieldNumberAction = UIAlertAction(title: "Zmień numer boiska", style: .Default, handler: {(action) in

        self.showAlertOfChangingFieldNumber(indexPath)

    })

    let sendToRefereeAction = UIAlertAction(title: "Wskaż sędziego", style: .Default, handler: {(action) in
        //self.championshitTournamentMode = false

    })

    let cancelAction = UIAlertAction(title: "Anuluj", style: .Cancel, handler: nil)

    alert.addAction(cancelAction)
    alert.addAction(changeFieldNumberAction)
    alert.addAction(sendToRefereeAction)

    self.presentViewController(alert, animated: true, completion: nil)
}

func showAlertOfChangingFieldNumber(indexPath: NSIndexPath) {

    let fieldNumberAlert = UIAlertController(title: "Numer boiska", message: "Wpisz numer boiska", preferredStyle: .Alert)

    fieldNumberAlert.addTextFieldWithConfigurationHandler({(textField: UITextField!) -> Void in
        textField.placeholder = "Numer boiska"
        textField.keyboardType = UIKeyboardType.NumberPad
    })

    let saveAction = UIAlertAction(title: "Zapisz", style: .Default, handler: {(action) -> Void in

        let fieldNumberTextField = fieldNumberAlert.textFields![0] as UITextField
        let fieldNumber = Int(fieldNumberTextField.text!)
        self.updateGameFieldNumber(fieldNumber!, indexPath: indexPath)
    })

    let cancelAction = UIAlertAction(title: "Anuluj", style: .Cancel, handler: nil)

    fieldNumberAlert.addAction(cancelAction)
    fieldNumberAlert.addAction(saveAction)

    self.presentViewController(fieldNumberAlert, animated: true, completion: nil)

}

func updateGameFieldNumber(fieldNumber: Int, indexPath: NSIndexPath){

    let gameKey = games[indexPath.row].key
    let ref = FIRDatabase.database().reference().child("games").child(gameKey)

    games[indexPath.row].fieldNumber = fieldNumber
    ref.updateChildValues(games[indexPath.row].toAnyObject() as! [NSObject : AnyObject])
    //self.games.removeAtIndex(indexPath.row+1)
    self.tableView.beginUpdates()
    self.tableView.reloadRowsAtIndexPaths(NSArray.init(object: indexPath) as! [NSIndexPath], withRowAnimation: .Automatic)
    self.tableView.endUpdates()
}

我的tableView委托函數和基於Firebase數據庫填充數組的函數如下所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! GameViewCellTableViewCell

    if games[indexPath.row].fieldNumber == 0 {
        cell.fieldNumberLabel.text = "-"
    } else {
        cell.fieldNumberLabel.text = String(games[indexPath.row].fieldNumber)
    }
    cell.firstParticipantLabel.text = games[indexPath.row].firstParticipant

    cell.secondParticipantLabel.text = games[indexPath.row].secondParticipant

    cell.gameImage.image = UIImage(named: "tenisBall")

    if games[indexPath.row].completed != true {
        cell.backgroundColor = UIColor.init(red: 1, green: 109.0/255, blue: 95.0/255, alpha: 1)
    } else {
        cell.backgroundColor = UIColor.init(red: 160/255, green: 1, blue: 86/255, alpha: 1)
    }

    return cell

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.games.count
}

func getGames() {

    let ref = FIRDatabase.database().reference().child("games")

    ref.observeEventType(.Value, withBlock: {snapshot in

        for item in snapshot.children {

            let gameItem = GameItem(snapshot: item as! FIRDataSnapshot)
            if(gameItem.tournamentName == self.tournamentName) {
                self.games.append(gameItem)
            }

        }
        self.tableView.reloadData()
    })

}

它會重復,因為您沒有更新“游戲”數組中的值,而是將修改后的值附加到數組中。 這發生在“ getgames()”方法中。

在 - 的里面

func getGames()

    self.games.append(gameItem)
dispatch_async(dispatch_get_main_queue(), { 
self.tableView.reloadData()
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM