我需要在完全加載UITableView之後調用一個函數。我知道在大多數情況下,第一次加載視圖時不會顯示每一行,但在我的情況下,它的確如此,因爲我總共只有8行。如何檢測UITableView何時完成加載所有行?
煩人的部分是被調用函數需要訪問一些tableView數據,因此,我不能在表完全加載之前調用它,否則我會得到一堆錯誤。
在viewDidAppear中調用我的函數會傷害用戶體驗,因爲此函數會更改UI。把它放在viewWillAppear中會搞砸執行(我不知道爲什麼),並將它放入viewDidLayoutSubviews中的效果非常好,但由於每次佈局更改時都會調用它,所以恐怕會在重新加載時出現一些錯誤的tableView。
我發現對這個主題的幫助很少。嘗試了幾件我在這裏找到的東西,但不幸的是,它似乎有點過時。可能的重複帖子的解決方案不起作用,我在發佈之前嘗試過。
任何幫助表示讚賞!謝謝。
編輯:我用一些數據填充我的tableView,我沒有問題。我有2個部分,每4行。默認情況下,用戶只能看到5行(第一部分是4,而第二部分只有一行隱藏了其餘部分)。當用戶點擊第一部分的第一行時,它將顯示第二部分的第一行。當他點擊第一部分的第二行時,它會顯示第二部分的兩行,依此類推。如果用戶再次單擊第一部分的第一行,則只顯示第二部分中的一個單元格。然後他可以保存他的選擇。
與此同時,系統會更改第一部分中所選行的顏色,以便用戶知道該怎麼做。
我的問題在這裏的一部分是我想更新我的數據庫中的模型。如果用戶想要修改記錄,那麼我需要將存儲在我的數據庫中的值與ViewController相關聯。因此,例如,如果他當時選擇了選項2,則需要確保第一部分中的第二行具有不同的顏色,並且當他試圖訪問視圖時,會顯示第二部分中的兩行。
下面是一些代碼:
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完成加載後立即調用前兩個函數。例如,當我初始化第一行時,我不能要求數據源顯示/隱藏一行或多行,因爲這些行尚未創建。
正如我所說的,如果這些函數在viewDidAppear中被調用,它就會像預期的那樣工作,因爲它不會立即選擇該行,也不會在第二節中儘快顯示適當的行數。在它之前我必須等待1-2秒。
你能提供更多的信息是什麼錯誤嗎?另外,也許有一些相關的代碼? – Shen
看不到背後的原因。初始化表格單元時,您應該已經知道所需的全部數據。 – zcui93
這不是重複的。我嘗試了以上,這對我來說工作不正常。 – Croisciento