我需要在完全加载UITableView后调用一个函数。我知道在大多数情况下,第一次加载视图时不会显示每一行,但在我的情况下,它确实只有8行。
令人讨厌的部分是被调用的函数需要访问一些tableView数据,因此,我无法在表被完全加载之前调用它,否则我会得到一堆错误。
在viewDidAppear中调用我的函数会损害用户体验,因为此函数会更改UI。把它放在viewWillAppear搞砸了执行(我不知道为什么)并把它放在viewDidLayoutSubviews中工作得非常好但是每次布局改变时都会调用它我害怕一些错误重新加载tableView时可能会发生。
我对这个话题几乎找不到帮助。试过我在这里找到的一些东西,但不幸的是它没有工作,因为它看起来有点过时了。可能重复的帖子解决方案不起作用,我在发布之前尝试过。
任何帮助表示赞赏!感谢。
编辑:我用一些数据填充我的tableView,我没有遇到任何问题。我有2个部分,每4行。默认情况下,用户只能看到5行(第一部分中有4行,而第二部分中只有一行,其余部分则被隐藏)。当用户单击第一部分的第一行时,它将显示第二部分的第一行。当他点击第一部分的第二行时,它会显示第二部分的两行,依此类推。如果用户再次单击第一部分的第一行,则仅显示第二部分中的一个单元格。然后他可以保存他的选择。
同时,系统会更改第一部分中所选行的颜色,以便用户知道该怎么做。
我的部分问题是我想在我的数据库中更新模型。如果用户想要修改记录,那么我需要将存储在我的数据库中的值与ViewController相关联。因此,例如,如果他当时拿起选项2,我需要确保第一部分中的第二行具有不同的颜色,并且当他尝试访问视图时显示第二部分中的两行。 / p>
这里有一些代码:
func setNonSelectedCellColor(indexPath: NSIndexPath) {
let currentCell = tableView.cellForRowAtIndexPath(indexPath)
currentCell?.textLabel?.textColor = UIColor.tintColor()
for var nbr = 0; nbr <= 3; nbr++ {
let aCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: nbr, inSection: 0))
let aCellIndexPath = tableView.indexPathForCell(aCell!)
if aCellIndexPath?.row != indexPath.row {
aCell?.textLabel?.textColor = UIColor.blackColor()
}
}
}
func hideAndDisplayPriseCell(numberToDisplay: Int, hideStartIndex: Int) {
for var x = 1; x < numberToDisplay; x++ {
let priseCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: x, inSection: 1))
priseCell?.hidden = false
}
if hideStartIndex != 0 {
for var y = hideStartIndex; y <= 3; y++ {
let yCell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: y, inSection: 1))
yCell?.hidden = true
}
}
}
每次用户触摸一行时都会调用这两个函数:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let path = (indexPath.section, indexPath.row)
switch path {
case(0,0):
setNonSelectedCellColor(indexPath)
hideAndDisplayPriseCell(1, hideStartIndex: 1)
data["frequencyType"] = Medecine.Frequency.OneTime.rawValue
case(0,1):
setNonSelectedCellColor(indexPath)
hideAndDisplayPriseCell(2, hideStartIndex: 2)
data["frequencyType"] = Medecine.Frequency.TwoTime.rawValue
case(0,2):
setNonSelectedCellColor(indexPath)
hideAndDisplayPriseCell(3, hideStartIndex: 3)
data["frequencyType"] = Medecine.Frequency.ThreeTime.rawValue
case(0,3):
setNonSelectedCellColor(indexPath)
hideAndDisplayPriseCell(4, hideStartIndex: 0)
data["frequencyType"] = Medecine.Frequency.FourTime.rawValue
default:break
}
}
我将值存储在字典中,以便在保存时解决验证问题。
我希望在我的tableView加载完成后立即调用前两个函数。例如,在初始化第一行时,我无法要求数据源显示/隐藏1行或更多行,因为这些行尚未创建。
正如我所说,如果在viewDidAppear中调用这些函数,它几乎可以正常工作,因为它不会立即选择行,也不会尽快在第二部分中显示相应的行数。在此之前我必须等待1-2秒。
答案 0 :(得分:0)
如果您已经有用于填充tableView的数据,那么您不能在函数中使用该数据吗?我假设数据是在表视图中显示的对象数组的形式。因此,您已经可以访问该数据,并可以在函数中使用它。
但是如果情况并非如此,如果您的表视图只有8行,那么您可以尝试实现此函数并在其中检查indexPath.row == 7(第8行是最后一行)。
tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
由于所有行都在一个屏幕上可见而不滚动,您可以使用此函数确定所有单元格已加载,然后调用您的函数。