Ios UItableView上不在UITableViewController内的奇怪行为
我有一个UIViewController,当用户单击按钮时,我想显示一个UITableView。我从服务器接收数据 问题是发生了一些奇怪的事情。有时,并非所有单元格都会更新。换句话说,在我的原型单元格中,有两个按钮,带有默认文本,但是当我从服务器加载数据时,并不是所有的按钮文本都会更新,而是当我滚动表时,它们会更新当我**滚动*表格时,有时按钮会返回默认文本 以下是我的代码:(非常简单) 更新 现在在else部分,我将右按钮的文本设置为“sometext” 这是一段关于这个问题的视频Ios UItableView上不在UITableViewController内的奇怪行为,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UIViewController,当用户单击按钮时,我想显示一个UITableView。我从服务器接收数据 问题是发生了一些奇怪的事情。有时,并非所有单元格都会更新。换句话说,在我的原型单元格中,有两个按钮,带有默认文本,但是当我从服务器加载数据时,并不是所有的按钮文本都会更新,而是当我滚动表时,它们会更新当我**滚动*表格时,有时按钮会返回默认文本 以下是我的代码:(非常简单) 更新 现在在else部分,我将右按钮的文本设置为“sometext” 这是一段关于这个问题的视频 看起来像是
看起来像是一个重用问题。基本上,如果你遵循苹果和其他地方的例子,它会使用一个出列函数。这意味着iOS将查找不再显示的现有单元格,并将其提供给您以绘制新单元格的内容。当然,如果旧牢房里有一堆东西,你会看到旧东西。解决方案是始终将所有内容分配给正确的新值
如果您的单元格具有可变信息,例如,如果您在某个条目中设置了一张图片,但在没有该图片的情况下未设置该图片,则可以轻松获得该信息。然后,当您得到一个没有图片的条目时,您的代码可能不会将其设置为nil,并且您会看到一个被滚动掉的旧单元格的图片。看起来像是一个重用问题。基本上,如果你遵循苹果和其他地方的例子,它会使用一个出列函数。这意味着iOS将查找不再显示的现有单元格,并将其提供给您以绘制新单元格的内容。当然,如果旧牢房里有一堆东西,你会看到旧东西。解决方案是始终将所有内容分配给正确的新值
如果您的单元格具有可变信息,例如,如果您在某个条目中设置了一张图片,但在没有该图片的情况下未设置该图片,则可以轻松获得该信息。然后,当您得到一个没有图片的条目时,您的代码可能不会将其设置为零,并且您将看到一个被滚动掉的旧单元格的图片。请让我解释一下重用
UITableViewCells
的工作原理
假设你有一个非常大的单元格,你在屏幕上只能看到3个单元格。
假设现在您在屏幕上看到以下单元格:
A
B
C
在屏幕上。。。您的数据源是:A
B
C
C
B
A
现在您正向下滚动1个单元格:
因此,单元格A
从上往下移动(它是第一个单元格),并成为最后一个可见的单元格
现在在屏幕上你会看到
B
C
A // While you want to draw a cell `C` here according to the dataSource
现在在cellforrowatinexpath中发生了什么…
您从一开始就得到了相同的单元格A
假设您的单元格A
只有一个按钮,而单元格C
需要显示两个按钮
因为您已经绘制了单元格A
,所以使用1个按钮绘制它(假设您将right button hidden属性设置为YES
)
因此,现在您希望在重用的单元格A
A上绘制单元格C
(假设您为单元格类型设置了标记,以了解在cellforrowatinexpath
中弹出的单元格类型)
现在您可以查询单元格的标记
if(myCell.tag == `A`/*(Assume you have an Enum for tags)*/)
{
//So here you will want to Unhide the Right button of the cell (which is currently still cell A
//After you have done with all needed adjustments you will want to set the appropriate tag for this cell to be ready for the next reuse -> so set it's tag to C
//Now next time this cell will get reused it will be drawn as cell `C` and it will think it is a cell `C`
}
请让我解释一下
UITableViewCells
的重用
假设你有一个非常大的单元格,你在屏幕上只能看到3个单元格。
假设现在您在屏幕上看到以下单元格:
A
B
C
在屏幕上。。。您的数据源是:A
B
C
C
B
A
现在您正向下滚动1个单元格:
因此,单元格A
从上往下移动(它是第一个单元格),并成为最后一个可见的单元格
现在在屏幕上你会看到
B
C
A // While you want to draw a cell `C` here according to the dataSource
现在在cellforrowatinexpath中发生了什么…
您从一开始就得到了相同的单元格A
假设您的单元格A
只有一个按钮,而单元格C
需要显示两个按钮
因为您已经绘制了单元格A
,所以使用1个按钮绘制它(假设您将right button hidden属性设置为YES
)
因此,现在您希望在重用的单元格A
A上绘制单元格C
(假设您为单元格类型设置了标记,以了解在cellforrowatinexpath
中弹出的单元格类型)
现在您可以查询单元格的标记
if(myCell.tag == `A`/*(Assume you have an Enum for tags)*/)
{
//So here you will want to Unhide the Right button of the cell (which is currently still cell A
//After you have done with all needed adjustments you will want to set the appropriate tag for this cell to be ready for the next reuse -> so set it's tag to C
//Now next time this cell will get reused it will be drawn as cell `C` and it will think it is a cell `C`
}
更新 主要问题不是单元重用,也不是我在下面解释的布局问题,而是使用:
cell.leftButton.titleLabel?.text = oneCusineDataLeft
设置按钮文本。您必须使用:
cell.leftButton.setTitle(oneCusineDataLeft, forState: .Normal)
相反。(本质上,ui按钮
跟踪处于不同“状态”时应显示的标题文本)-正常、选中等。虽然your代码更改当前显示的文本,但一旦按钮更改状态,它会将文本设置回存储值。我假设在显示单元格时按钮状态会重置。setTitle
方法会更新存储值)
原创
撇开单元重用问题不谈,我认为您的代码不会达到您想要的效果。按照当前编码,布局如下所示:
Row 0: left: cuisine 0, right: cuisine 1
Row 1: left: cuisine 1, right: cuisine 2
Row 2: left: cuisine 2, right: cuisine 3
我猜你真的想要这个:
Row 0: left: cuisine 0, right: cuisine 1
Row 1: left: cuisine 2, right: cuisine 3
Row 2: left: cuisine 4, right: cuisine 5
如果是这种情况,请按如下方式修改代码:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentefiers.oneCusinePreferencesCell.rawValue, forIndexPath: indexPath) as! OneCusinePreferencesTableViewCell
var row = indexPath.row
print("row = \(row)")
let oneCusineDataLeft = Preferences2ViewController.cusines![2*row]
cell.leftButton.titleLabel?.text = oneCusineDataLeft
if (2*row+1) < Preferences2ViewController.cusines!.count{
let oneCusineDataRight = Preferences2ViewController.cusines![2*row+1]
cell.rightButton.titleLabel?.text = oneCusineDataRight
}else {
//I should hide the right button
cell.rightButton.titleLabel?.text = ""
}
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let cusines = Preferences2ViewController.cusines {
if cusines.count % 2 == 0 {
return cusines.count/2
}else {
return (cusines.count+1)/2
}
}else {
return 0
}
}
func tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{
让cell=tableView.dequeueReusableCellWithIdentifier(CellIdentifiers.oneCusinePreferencesCell.rawValue,forIndexPath:indexPath