无法重新加载 UITableView
Posted
技术标签:
【中文标题】无法重新加载 UITableView【英文标题】:Can't reload UITableView 【发布时间】:2016-08-06 11:57:17 【问题描述】:我正在尝试设计 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 中重新加载数据。即使在阅读了 Apple 的文档之后。
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()
)
【问题讨论】:
这是一个简单的场景。对于初学者,您应该可以简单地调用 self.tableView.reloadData()。如果这不起作用,那么您有一个更根本的问题,使用 .reloadRowsAtIndexPath 或 performSelectorOnMainThread 无法解决。 你的 cellForRowAtIndexPath、numnerOfSections 和 numberOfRowsInSection 函数是什么样的? @MikeTaverne 我已经编辑了我的帖子,所以你可以看到 tableView 委托函数内部发生了什么。 【参考方案1】:它被复制了,因为您没有更新“游戏”数组中的值,而是将修改后的值附加到数组中。这发生在“getgames()”方法中。
【讨论】:
我知道我正在附加数组,但它只在加载控制器时发生一次。根据您的建议,我添加了一个函数,在刷新 tableView 之前从数组中删除任何重复项。 如果你检查游戏是否已经存在于你的观察块的数组中,也许会更有效。如果是,更新它,如果不是追加。这样每个游戏第一次都会被添加,当块被自动调用更新时,它不会附加任何你以后必须删除的数据。 谢谢!我使用数组的contains
属性来检查游戏是否已经存在。这解决了我的问题。【参考方案2】:
里面
func getGames()
之后
self.games.append(gameItem)
dispatch_async(dispatch_get_main_queue(),
self.tableView.reloadData()
)
【讨论】:
以上是关于无法重新加载 UITableView的主要内容,如果未能解决你的问题,请参考以下文章
如果在重新加载期间触摸单元格,则重新加载后无法选择 UICollectionView 单元格
Objective C - WebView无法从顶部重新加载