Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.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上不在UITableViewController内的奇怪行为_Ios_Swift_Uitableview - Fatal编程技术网

Ios UItableView上不在UITableViewController内的奇怪行为

Ios UItableView上不在UITableViewController内的奇怪行为,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个UIViewController,当用户单击按钮时,我想显示一个UITableView。我从服务器接收数据 问题是发生了一些奇怪的事情。有时,并非所有单元格都会更新。换句话说,在我的原型单元格中,有两个按钮,带有默认文本,但是当我从服务器加载数据时,并不是所有的按钮文本都会更新,而是当我滚动表时,它们会更新当我**滚动*表格时,有时按钮会返回默认文本 以下是我的代码:(非常简单) 更新 现在在else部分,我将右按钮的文本设置为“sometext” 这是一段关于这个问题的视频 看起来像是

我有一个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