Int与IndexPath的麻烦

时间:2017-03-26 01:05:52

标签: ios swift uitableview

我正在编写一个循环遍历UITableViewController中所有单元格的函数。以下是我到目前为止的情况:

var i = 0
while (i < tableView.numberOfRows(inSection: 0)) {
    i += 1
    let cell = tableView.cellForRow(at: i-1)
}

一切都正常循环,直到我试图获取细胞。它期望输入类型IndexPath,但是我传入Int。每当我强制它像IndexPath一样:

let cell = tableView.cellForRow(at: i-1 as! IndexPath)

我得到一个警告,说它总会失败/总是返回零。有没有更好的方法来做到这一点,或者我只是错过了关键的一步。任何帮助是极大的赞赏。提前谢谢!

编辑(更多解释):所有单元格都是自定义类别单元格,具有特定变量。我想循环遍历所有单元格并获得该值。

let visibleCells = tableView.visibleCells
for aCell in visibleCells {
    print(aCell.question?.text) <------- this is the value I want
}

4 个答案:

答案 0 :(得分:2)

您应该通过代码创建IndexPath,如下所示:

let ndx = IndexPath(row:i, section: 0)

或者,修改代码:

var i = 0
while (i < tableView.numberOfRows(inSection: 0)) {
    i += 1
    let ndx = IndexPath(row:i-1, section: 0)
    let cell = tableView.cellForRow(at:ndx)
}

基于后面的编辑,你提到你想要每行上的文本字符串的值,我建议上面的内容可能不是最好的方法:)(我知道其他人已经说过这个,但我不想对你想做什么做出假设,除非你明确说明你想要的东西......)

您可能最好采用相同的方法通过cellForRowAt:填充表格视图单元格的数据来获取问题文本而不是循环遍历所有表格行,这会导致一些问题其他人已表明的不可见行。

如果您在获取cellForRowAt:的数据时遇到任何问题,请与我们分享cellForRowAt:的代码,我相信我们其中一人可以帮助您解决问题:)< / p>

答案 1 :(得分:2)

以下大多数信息在其他答案和评论中已被其他人说过,但我想把它放在一个地方:

我们需要退回问题的具体细节,并询问您实际上要做什么。

UITableView方法cellForRow(at:)只会返回实际在屏幕上的单元格。如果只有5个单元格的空间,并且您必须滚动以显示其余单元格,那么除了可见的单元格之外,该方法将返回nil。

正如其他人所建议的那样,如果您的目标是遍历屏幕上的单元格,则属性tableView.visibleCells将是更好的选择。

如果您的目标是遍历数据中存在的所有单元格,那么您需要解释您要执行的操作。

至于您的具体问题,cellForRow(at:)需要IndexPath类型的参数。您不能简单地将Int转换为IndexPath。那会失败。相反,正如@TaylorM在他们的回答中所说,你需要创建一个IndexPath。如果您的表格视图只有一个部分,那么您只需使用

即可
let indexPath = IndexPath(row: i, section: 0)

(假设您修复了循环代码,因此索引从0开始。)

使用像这样的while循环也没有意义。

而不是所有这些,我建议使用:

let visibleCells = tableView.visibleCells
for aCell in visibleCells {
   //Do something with the cell
}

答案 2 :(得分:0)

尝试

let indexPath = IndexPath(row: i, section: 0)

您可能需要调整部分以满足您的需求。

查看IndexPath的文档。与大多数类和结构一样,IndexPath具有initializers。如果你需要创建任何对象的新实例,你最喜欢使用初始化器。

*另见@rmaddy的评论: “与你的问题无关,但我几乎可以保证你试图循环遍历所有细胞是错误的。你的实际目标是什么?”

答案 3 :(得分:0)

我相信我已经用精彩的人的所有帮助想出来了。

就我而言,我有一个自定义类,其中包含我想要访问的变量。我可以做Taylor M,Fahim和Duncan C所说的话:let indexPath = IndexPath(row: i, section: 0)

然后我可以在末尾添加as! NumberTableViewCell,这样我就可以访问那里定义的值。最后,它看起来像这样:

var i = 0
while (i < tableView.numberOfRows(inSection: 0)) {
    i += 1
    var cell = tableView.cellForRow(at: IndexPath(row: i-1, section: 0)) as! NumberTableViewCell
    print(cell.question.text!)
    }

谢谢大家的帮助!