Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从UITableView获取所有单元格_Ios_Swift_Uitableview - Fatal编程技术网

Ios 从UITableView获取所有单元格

Ios 从UITableView获取所有单元格,ios,swift,uitableview,Ios,Swift,Uitableview,我想从UITableView中获取所有单元格,我理解tableView。visableCells将返回屏幕上可见的单元格数组,但我需要获取所有单元格 下面是我计划如何实现这一目标的大致情况,但是我无法确定如何获得所有的单元格,而不仅仅是可见的单元格。用户将能够对UITableView单元格重新排序,我希望在移动UITableView单元格后能够记录每个单元格的索引,这就是我需要所有单元格的原因 var textArray : [String] = [] // This is populated

我想从
UITableView
中获取所有单元格,我理解
tableView。visableCells
将返回屏幕上可见的单元格数组,但我需要获取所有单元格

下面是我计划如何实现这一目标的大致情况,但是我无法确定如何获得所有的单元格,而不仅仅是可见的单元格。用户将能够对
UITableView
单元格重新排序,我希望在移动
UITableView单元格后能够记录每个单元格的索引,这就是我需要所有单元格的原因

var textArray : [String] = [] // This is populated elsewhere and contains 30+ items
var textDict = [String:String]()


// allCellIndexPaths is a placeholder. I need to know how to get all Cell IndexPaths
for cellIndex in allCellIndexPaths { 
    let cell = tableView.cellForRow(at: cellIndex)
    let text = cell.textLabel.text
    textDict["Cell \(cellIndex.row)"] = text
}
之所以需要这样做,是因为我正在将
textDict
保存到一个文件中,这样当用户重新排序单元格时,我正在保存它们的新索引,然后即使在应用程序完全关闭并重新打开后,我也可以按照我保存的索引值的顺序加载内容。这也是为什么我不能只记录
sourceindepath
destinationindepath
的值,因为这可能会导致我的dict中有两个相同的索引,这就是为什么我想得到每个单元格索引及其文本的列表


完全可以找到一种更好的方法来实现这一点

我认为您不需要所有的单元来实现对单元的重新排序。您只需要正确映射重新排序索引XPath。下面是一个链接,它有一个正确的例子来对单元格进行重新排序。

您需要在编辑模式下创建表格

self.tableView.isEditing = true
如果要在编辑模式下隐藏“删除”按钮,请使用:

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .none
}

override func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
    return false
}
通过覆盖tableView:MoveRowatineXpath:启用“重新排序”控件来移动单元格,并实现该方法,以便更新基础数据列表中的元素:

override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    let movedObject = self.headlines[sourceIndexPath.row]
    headlines.remove(at: sourceIndexPath.row)
    headlines.insert(movedObject, at: destinationIndexPath.row)
}

是的,我已经在这样做了,但是一旦我对单元格重新排序,我想保存每个单元格的索引,这样当我重新打开应用程序时,我可以按更改的顺序调用它。下面是一些方法。您可以使用逻辑来显示要显示的位置,tableview将根据数据源跟随您。另一种方法是状态恢复。单元格只是底层数据模型的视图。因为单元格只是一个视图,所以只能获取实际可见行的单元格。不可能为屏幕上未显示的行获取单元格。当您的表被重新排序时,您应该重新排序
textArray
,并且您不需要从单元格中读取文本;它已在您的阵列中。不需要
textDict
,因为它本质上是一个数组-它的键是行序数的字符串版本。@Paulw11想要这样做的原因是我正在将
textDict
保存到一个文件中,这样当用户重新排序单元格时,我正在保存它们的新索引,然后,即使应用程序完全关闭并重新打开,我也可以按照保存的索引值的顺序加载内容。这也是为什么我不能只记录
sourceindepath
destinationindepath
的值,因为这可能会在我的dict中产生两个相同的索引,这就是为什么我想得到每个单元格索引及其文本的列表。但您可以只保存数组。带有整数键的字典(或者在您的例子中是整数的字符串表示形式)只是一个数组(除了字典可以处理稀疏性,但这不是这里的要求)。无论如何,您只需要更新字典中的两个相关键。不能有两个具有相同密钥的条目。字典不是这样工作的。