未正确加载/显示UITableView可扩展单元格内容

时间:2017-06-22 13:54:28

标签: ios swift uitableview uipickerview

我有UITableView动态原型单元格,其中包含一些标签和UIPickerView。 我将一个数组定义为UIPickerView的默认源,我还添加了所需的方法:

var dataPicker =
[
    "Option 1", "Option 2", "Option 3"
]

/*
// MARK: - UIPickerView methods
*/

func numberOfComponents(in pickerView: UIPickerView) -> Int
{
    print("JobVC > pickerView > numberOfComponents")

    //In this case this is always 1
    return pvComponents
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
    print("JobVC > pickerView > numberOfRowsInComponent")

    return dataPicker.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
    print("JobVC > pickerView > titleForRow")

    return dataPicker[row]
}

UIPickerView数据会根据我选择的行而改变,因此我决定在dataPicker函数中设置didSelectRowAt数组数据:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    print("JobVC > tableView > didSelectRowAtIndexPath")

    if(indexPath.row == 0)
    {
        dataPicker =
            [
                "Option 1", "Option 2", "Option 3", "Option 4"
            ]
        selectedCell = 0
    }
    else if(indexPath.row == 1)
    {
        dataPicker = []

        let currentYear = Calendar.current.component(.year, from: Date())

        for year in 1970...currentYear
        {
            dataPicker.append( String(year) )
        }

        selectedCell = 1
    }
    else if(indexPath.row == 2)
    {
        dataPicker =
            [
                "Option 1", "Option 2", "Option 3", "Option 4", "Option 5", "Option 6"
            ]

        selectedCell = 2
    }
    else if(indexPath.row == 3)
    {
        dataPicker =
            [
                "Option 1", "Option 2", "Option 3"
            ]

        selectedCell = 3
    }
    else if(indexPath.row == 4)
    {
        dataPicker =
            [
                "Option 1", "Option 2"
            ]

        selectedCell = 4
    }
    else if(indexPath.row == 5)
    {
        dataPicker =
            [
                "Option 1", "Option 2", "Option 3"
            ]

        selectedCell = 5
    }

    //Expandable cell  stuff

    guard let cell = tableView.cellForRow(at: indexPath) as? JobExpandableCell
        else { return }

    switch cell.isExpanded
    {
        case true:
            self.expandedRows.remove(indexPath.row)
        case false:
            self.expandedRows.insert(indexPath.row)
    }

    cell.isExpanded = !cell.isExpanded

    self.tblJob.beginUpdates()
    self.tblJob.endUpdates()
}

现在,我在另外3个案例中做了同样的事情,每次都出去了。但这次行为有点不同。

如果我开始从第一个(indexPath.row = 0)开始选择行,则单元格会展开,UIPickerView会显示每行所需的数据集。

但是,如果我开始随机选择行或从最后一行(indexPath.row = 5)开始,则在我选择第一行或第二行之前,它不会显示任何选择器视图。从那时起,它开始在每个单元格上显示它。

这只在我第一次访问该屏幕时发生(ViewController)。如果我从底部重新开始,在我解雇VC或退出应用程序之前没有问题。

enter image description here

我检查了dataPicker[]数组,如果我每次点击行都填写了所需的数据,并且没有错误/警告。

事实上,这个VC和其他相同代码工作正常的其他区别的唯一区别是,在这种情况下,我有6行,而在所有其他的我有2或3行。

有什么想法吗?我现在已经尝试了一段时间没有任何运气来解决这个问题。不幸的是,我不太确定在这种情况下要搜索什么。

LE:我想我弄清楚为什么会这样。 UITableView仅为可见区域加载单元格,而不是所有可用单元格,因为它旨在显示大量数据,这将导致内存问题。用户滚动时会加载单元格数据。

然而,在这种情况下,我假设所有细胞都不可见,因为它们是可扩展细胞,每个细胞都有235px。这意味着只加载了2个单元,因为只能同时显示2个单元。 问题是我无法滚动,因为一次只扩展一个单元格。

有什么建议吗?

0 个答案:

没有答案