我只是想知道为什么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
}
答案 0 :(得分:1)
我相信您观察到的行为是由于tableView单元格的重用。当您触摸按钮然后更改其颜色时,包含该按钮的单元格仅与该表格行相关联,直到它滚出屏幕。单元格(和按钮)将重新用于屏幕上显示的另一行。如果您未在cellForRowAtIndexPath
中设置颜色,则屏幕上的单元格可能会显示已选中的已使用按钮。
要做到这一点,你需要做三件事:
独立于按钮,您需要跟踪模型中按下的按钮。例如,在视图控制器类中,有一组布尔值,表中的每个按钮都有一个条目。
var selected:[Bool] = Array(count: 100, repeatedValue: false)
在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()
}
在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)
}