,问题是每个自定义单元格在他们一个拨动开关,如果它是在后来我补充一点,细胞的值进行计算,但是由于缺少一些未加载的单元格(一旦向下滚动,它们会加载),计算就不完整。
希望这是有道理的。这是在一个蓝牙连接应用程序,它应该刷新表,每次它收到新的值。这里的加载细胞代码:加载UITableViewCells不在显示
//TABLE LOADING/RELOADING FUNCTIONS:
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return temperatureReadingArray.count //Should return 1 or 9 depending on array received
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: temperatureReading) as! TemperatureReading
cell.channelLabel.text = channelNames[indexPath.row]
cell.readingLabel.text = temperatureReadingArray[indexPath.row]
if (channelNames.count == 1)
{
cell.toggleSwitch.isHidden = true
}
if (cell.toggleSwitch.isOn)
{
if let value = Double(cell.readingLabel.text!)
{
print("valid number: \(value), appending")
TNUArray.append(value)
}
else
{
print("Not a valid number reading")
}
}
return cell
}
正如你所看到的,我检查拨动开关,到目前为止,该代码的工作,因为我打算,假设所有细胞适应可见的窗口内,但是当我运行有一个小屏幕的设备上,或者如果我得到太多的值(超过适合屏幕),那么不可见没有得到朝TNU计算细胞计数:
func updateIncomingData() {
print ("Received String:")
print (receivedDataString)
print("Clearing TNU Array")
TNUArray.removeAll()
temperatureReadingArray = receivedDataString.components(separatedBy: " ")
self.temperatureReadingsTable.reloadData()
DispatchQueue.main.async {
self.calculateTNU() //Need dispatch queue to run this AFTER it finished reloading data
}
}
func calculateTNU()
{
var TNU: Double = 0.000
let minValue = TNUArray.min()
let maxValue = TNUArray.max()
print(TNUArray)
if (minValue != nil && maxValue != nil)
{
TNU = maxValue! - minValue!
calculatedTNU = String(format:"%.3f", TNU)
TNULabel.text = calculatedTNU
}
else
{
print("Max or Min had nil values")
TNULabel.text = "NA"
}
}
我希望我是清楚了,我会试着总结一下它的,都应该发生的事情的顺序:
- 接收蓝牙字符串(它CONTA INS)用空格分隔的多个值
- 解析这些值转换为数值数组,让我们假设我得到9个价值
- 添加一个值,每个细胞,具有一个切换开关
- 检查该单元的开关已打开并且如果它已经该值然后添加到一个数组,以计算
值之间的差MAX - 计算最大值 - 最小值的值
- 显示值。
的问题是计算因为它使用来计算它需要ALL细胞加载阵列的最大值 - 最小值的值,并且不适合在屏幕的细胞不加载除非我滚动。
注:我也尝试过使用DispatchQueue.main.async和reloadData(),但是这并不能解决问题,因为它不会加载不在显示
在MVC范例下,您需要将单元格中的切换数据存储在您的数据模型中,而不是依赖于能够从单元格本身读取 - 当单元格从视图中消失时,它会自动出列,信息。一个简单的方法是维护和数组或字典,告诉你哪些索引路径包含切换的单元格 - 唯一的问题是如果你的表格视图是可编辑的,所以你需要小心。希望有所帮助。 – Sparky
我喜欢这个想法,我正在探索这个概念。只是一个简单的问题,说我切换单元格上的开关,我如何告诉数组/字典“嗨,它是单元格X切换,而不是单元格Y”,我该如何引用单元格内的单元格索引? –
你可以做的一件事是子类UICollectionViewCell,建立一个委托协议并使你的集合视图符合该协议。然后,您可以让单元格通知委托单元何时切换,然后集合视图可以更新模型(如果您不知道内置于UiCollectionView API中的方法可以检索单元格的索引路径) 。如果你对此不清楚,可能会在聊天中给我留言(而不是扩展此主题)。 – Sparky