2017-03-26 94 views
0

我正在写一个函数来循环遍历UITableViewController中的所有单元格。这是我到目前为止:Int与IndexPath的烦恼

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 
} 
+1

与您的问题无关,但我几乎可以保证您尝试循环遍历所有单元格是错误的操作。这个循环的目标是什么? – rmaddy

+0

可能更好地使用'tableView.visibleCells',这取决于你的实际目标,就像rmaddy刚刚问过的那样。 –

+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:与我们的代码,我敢肯定,我们可以帮你理出头绪:)

+0

为什么使用'while'循环而不是'for'循环?为什么在使用当前值之前增加'i'? – rmaddy

+1

@rmaddy我只是简单地使用他提供的逻辑,因为我假设他有一些逻辑思想,但我可能是错的:) – Fahim

+0

我认为OP刚刚开始,并不真正了解他在做什么。他需要告诉我们他确切的目标。 –

0

尝试

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

您可能需要调整节以适应您的需求。

查阅关于IndexPath的文档。像大多数课程和结构一样,IndexPathinitializers。如果你需要创建任何对象的新实例,你最喜欢使用初始化器。

*另请参阅@rmaddy的评论: “与您的问题无关,但我几乎可以保证您尝试循环遍历所有单元格是错误的做法。 “

2

大多数下面已被他人在其他的答案和评论说的信息,但我希望把它在一个地方:

我们需要从问题的细节后退一步,问什么你实际上正在努力去做。

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

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

如果您的目标是循环访问数据中存在的所有单元格,那么您需要解释您正在尝试执行的操作。

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

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

(假设您解决您的循环代码,以便您的索引从0开始)

它也没有意义使用,而像那样循环。

代替这一切的,我建议使用:

let visibleCells = tableView.visibleCells 
for aCell in visibleCells { 
    //Do something with the cell 
} 
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!) 
    } 

谢谢大家的帮助!

+0

这根本就是错的。你不想从单元中获取数据。单元格仅临时显示数据。您的数据模型中必须包含所有数据。只需遍历数据模型,而不是单元格。 – rmaddy

+0

我同意rmaddy。您不应该将数据保存在单元格中。每当一个单元格在屏幕外滚动时,它就会被回收并丢失数据。您应该有一个数据模型来保存您在表格视图中显示的信息以及来自用户的任何输入。一个数组适用于1节的表视图。一个数组数组适用于分段表视图。 –

+0

此表视图最多只有六个单元格,所以我认为这是适当的方法。谢谢! –