Xcode6 swift UIButton发件人不是唯一的吗?

时间:2014-11-16 19:36:55

标签: ios swift uibutton xcode6

我只是想知道为什么UIButton的发送者不是唯一的或改变的。我有一个动态填充的tableview(大约100行),每个单元格中都有一个按钮。所有按钮都具有动态,因此具有不同的标签ID。在点击事件功能中,我想更改按钮并执行其他操作。

如果我使用按钮发件人识别按钮,例如更改颜色也会更改列表中的另一个按钮。

似乎发送者在滚动时正在改变。一切都很奇怪。

抱歉是傻瓜。我假设有一些我不知道的明显的东西。

func followButtonTapped(sender: UIButton) {
    println(sender)
    println("UserID: \(sender.tag)")
    sender.enabled = false
    sender.backgroundColor = UIColor.grayColor()
    sender.setTitle("...", forState: UIControlState.Normal)
}

这是一个示例发件人:

<UIButton: 0x7fe5249bacd0; frame = (297 17; 63 24); opaque = NO; autoresize = RM+BM; tag = 1147; layer = <CALayer: 0x7fe5249c2b10>>
UserID: 1147

这是我的cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

    tableView.tableFooterView = UIView(frame: CGRectZero)
    tableView.estimatedRowHeight = 58

    var cell : followCell! = tableView.dequeueReusableCellWithIdentifier(followCellIdentifier) as followCell!

    if(cell == nil){
        cell = NSBundle.mainBundle().loadNibNamed(followCellIdentifier, owner: self, options: nil)[0] as followCell;
    }

    cell?.followName?.text=self.maintext[indexPath.row]
    cell?.followSubtext?.text = self.subtext[indexPath.row]
    cell?.followButton?.addTarget(self, action: "followButtonTapped:", forControlEvents: .TouchUpInside)
    cell?.followButton?.tag = self.UserIds[indexPath.row].toInt()!

    var image = UIImage(named: "default_avatar_40.jpg")

    var imgURL: NSURL = NSURL(string: self.images[indexPath.row])!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
        if error == nil {
            var image = UIImage(data: data)

            if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as? followCell {
                cellToUpdate.followImage.image = image
            }
        }
    })

    cell?.backgroundColor = UIColor.clearColor()

    return cell as followCell
}

1 个答案:

答案 0 :(得分:1)

我相信您观察到的行为是由于tableView单元格的重用。当您触摸按钮然后更改其颜色时,包含该按钮的单元格仅与该表格行相关联,直到它滚出屏幕。单元格(和按钮)将重新用于屏幕上显示的另一行。如果您未在cellForRowAtIndexPath中设置颜色,则屏幕上的单元格可能会显示已选中的已使用按钮。

要做到这一点,你需要做三件事:

  1. 独立于按钮,您需要跟踪模型中按下的按钮。例如,在视图控制器类中,有一组布尔值,表中的每个按钮都有一个条目。

    var selected:[Bool] = Array(count: 100, repeatedValue: false)
    
  2. cellForRowAtIndexPath中,根据模型中的布尔数组设置按钮。

    要知道某个按钮与哪个行相关联,您可以将按钮的标记设置为indexPath.row中的cellForRowAtIndexPath,然后访问sender.tag中的followButtonTapped

    cell.button.tag = indexPath.row
    if selected[indexPath.row] {
        cell.button.enabled = false
        cell.button.backgroundColor = UIColor.grayColor()
    } else {
        cell.button.enabled = true
        cell.button.backgroundColor = UIColor.whiteColor()
    }
    
  3. followButtonTapped中更改数组中与您选择的按钮对应的布尔值。

    func followButtonTapped(sender: UIButton) {
        let row = sender.tag
        selected[row] = true
        println(sender)
        println("UserID: \(sender.tag)")
        sender.enabled = false
        sender.backgroundColor = UIColor.grayColor()
        sender.setTitle("...", forState: UIControlState.Normal)
    }