2016-03-03 55 views
2

我需要在完全加載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秒。

+0

你能提供更多的信息是什麼錯誤嗎?另外,也許有一些相關的代碼? – Shen

+0

看不到背後的原因。初始化表格單元時,您應該已經知道所需的全部數據。 – zcui93

+0

這不是重複的。我嘗試了以上,這對我來說工作不正常。 – Croisciento

回答

0

如果您已經有數據用於填充tableView,那麼您不能在函數中使用該數據本身嗎?我假定數據是以表格視圖中顯示的對象數組的形式存在的。因此,您已經可以訪問該數據並可以在該功能中使用它。

但是,如果不是這樣的話,如果你的表視圖只有8行,那麼你可以嘗試實現這個功能,並檢查indexPath.row == 7(第8行是最後一行)。

tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

由於所有的行是不滾動,你可以使用這個功能來確定所有的細胞已經被加載,然後調用你的函數在一個屏幕本身可見。

+0

這不是爲我打電話。根據文檔,此代理將檢測何時從tableView中刪除了一行。 – Croisciento

+0

你只使用自定義數據源,didenddisplaying是一個從tableview委託設置tableview.delegate的方法來調用它 –

相關問題