Ios 如何更改单元格内按钮的标题

Ios 如何更改单元格内按钮的标题,ios,swift,uitableview,uicollectionview,Ios,Swift,Uitableview,Uicollectionview,我有一个集合视图,里面有一个按钮。 当我点击这个按钮时,我想更改它的名称。 我设法做到了,但当我点击它时,它会改变,如果我有20个按钮,其中10个是这样的,如果我点击第一个按钮,它会改变0,2,4,6,8,如果我点击了一个不在列表中的按钮,那么所有按钮都会被选中 这是我的代码: @IBAction func following(sender: AnyObject) { if follow.tag == sender.tag { follow.setTitle("

我有一个集合视图,里面有一个按钮。 当我点击这个按钮时,我想更改它的名称。 我设法做到了,但当我点击它时,它会改变,如果我有20个按钮,其中10个是这样的,如果我点击第一个按钮,它会改变0,2,4,6,8,如果我点击了一个不在列表中的按钮,那么所有按钮都会被选中

这是我的代码:

 @IBAction func following(sender: AnyObject) {
        if follow.tag == sender.tag {
        follow.setTitle("Following", forState: .Normal)
        }
        print("\(follow.tag) \(sender.tag)")
    }

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Interest Cell", forIndexPath: indexPath) as! ThirdTabCell

        cell.follow.tag = indexPath.row
        return cell



        }
在button的函数中,我也尝试过不使用if语句,但还是遇到了同样的问题。 当我打印标签时,它只打印被点击的按钮

我也试着将其应用于我的ViewController

  cell.follow.addTarget(self, action: #selector(ThirdTab.follow(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
//inside cellForItemAtIndexPath

     func follow(sender:UIButton!) {



        }

只是一个简短的概述,您就可以得到您的答案了

UICollectionView经过高度优化,因此只在内存中保留屏幕上可见的行。现在,所有行单元格都缓存在池中,并被重用,而不是重新生成。无论何时,用户滚动UICollectionView,它都会在池中添加刚刚隐藏的行,并将它们重新用于下一个可见的行

那么,现在来看你的答案

当您点击按钮时,其标题将被更新,但当您滚动收藏视图时,带有“更新的按钮文本”的同一单元格将被重新使用,这将导致您看到的问题

解决方案

将按钮状态保存在数组中的操作方法中

@IBAction func following(sender: AnyObject) {
        if follow.tag == sender.tag {
          array[sender.tag] = "<text>"
          collectionView.reloadData()
        }
        print("\(follow.tag) \(sender.tag)")
    }

请在以下功能中更改设置标题行下方的内容

既有线:

follow.setTitle("Following", forState: .Normal)
新行:

follow.setTitle("Following", forState: UIControlState.Normal)
希望这对你有用


谢谢

我建议你这样做

cellForItemAtIndexPath
中,您可以像这样分配按钮插座

cell.followOutlet.tag = indexPath.row
然后在follow函数中,你可以这样做

@IBAction func following(sender: AnyObject) {
        let follow = sender as! UIButton
        let indexP = NSIndexPath(forRow: follow.tag, inSection: 0)
        let cell = yourCollectionView.cellForItemAtIndexPath(indexP) as! yourCellName

        follow.setTitle("Following", forState: .Normal)

    }

现在你可以用你的按钮做任何你想做的事。

我可以问一下下面是什么吗()?因为你不能从可重复使用的细胞中进行IBAction。另外,我假设发送者应该是UIButton而不是AnyObject?ibaction func在cell Classic中,我建议你在VC中创建一个选择器方法。我的常规类中有一个用于按钮的函数,但我不知道如何在1分钟内只更改一个按钮。我将编辑我的问题,看看当你使用cellForItemAtIndexPath时我有什么,按一下按钮。followButton.addTarget(self,action:#selector(myClass.follow(:)),forControlEvents:.TouchUpInside)它不起作用…我将尝试一些更改,并会通知您确定,但是想知道-哪一部分不起作用?如果不允许将集合视图中的元素链接到集合视图单元格文件以外的任何内容,那么所有这些怎么可能在一个视图控制器中呢?Jevon,我在上面建议“viewcontroller中的所有内容”,因为OP的问题都是在视图控制器中编写的目标代码!我更喜欢链接CollectionViewCell内的元素,然后使用委托调用ViewController!因此,viewController中的所有内容都不是强制性的!希望它能让你明白同样的问题。现在在Swift中枚举是正常的。有独立的状态。现在什么都不做
@IBAction func following(sender: AnyObject) {
        let follow = sender as! UIButton
        let indexP = NSIndexPath(forRow: follow.tag, inSection: 0)
        let cell = yourCollectionView.cellForItemAtIndexPath(indexP) as! yourCellName

        follow.setTitle("Following", forState: .Normal)

    }