在 swift 的 tableviewCell 中实现点赞按钮
Implementing a like button in a tableviewCell in swift
我想在我的每个 table 视图单元格中创建一个赞按钮。按下时,按钮将变为 "unlike"。我能够通过在我的 subclass 中创建一个 IBOutlet 并在我的 tableviewcontroller class 中使用 sender.setTitle("unlike",forState: UIControlState.Normal).但是当我单击它时,该方法也会将一堆其他 tableviewcell 的按钮变成 "unlike",基本上复制了一个单元格的行为。它这样做的方式是每隔一个单元格进行更改,因此如果我单击 2 个连续单元格的 "like" 按钮,table 视图中的所有单元格都将变为 "unlike"。这是我的 tableViewController:
代码
class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 30
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell
cell.tag = indexPath.row
cell.like.tag = indexPath.row
cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside)
return cell
}
@IBAction func handleLikes(sender: AnyObject){
println(sender.tag) // This works, every cell returns a different number and in order.
sender.setTitle("Pressed", forState: UIControlState.Normal)
}
这是我的 TableViewCell 代码 class:
class TableViewCell: UITableViewCell {
@IBOutlet weak var like: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
此外,这无关紧要,但如果有人阅读本文可以告诉我如何改进我的风格 and/or 代码的清晰度,我也将不胜感激。
UITableViewCell
可重复使用。这意味着您必须将每个单元格的标题设置为 "unlike" 或 "like"。最简单的方法是在 ViewController
中创建一个字符串数组,因为我想您无论如何都会读取数据
将此添加到您的 ViewController
:var likes: [String]!
在 ViewDidLoad 中:likes = [String](count: 20, repeatedValue: "like")
请注意,长度应基于您将显示的 UITableViewCells
个数。
你的cellForRowAtIndexPath
:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell
cell.like.tag = indexPath.row
cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside)
cell.like.setTitle(likes[indexPath.row], forState: UIControlState.Normal)
return cell
}
handleLikes
函数:
func handleLikes(sender: AnyObject){
println(sender.tag) // This works, every cell returns a different number and in order.
if likes[sender.tag] == "like" {
likes[sender.tag] = "unlike"
}
else {
likes[sender.tag] = "like"
}
sender.setTitle(likes[sender.tag], forState: UIControlState.Normal)
}
我想在我的每个 table 视图单元格中创建一个赞按钮。按下时,按钮将变为 "unlike"。我能够通过在我的 subclass 中创建一个 IBOutlet 并在我的 tableviewcontroller class 中使用 sender.setTitle("unlike",forState: UIControlState.Normal).但是当我单击它时,该方法也会将一堆其他 tableviewcell 的按钮变成 "unlike",基本上复制了一个单元格的行为。它这样做的方式是每隔一个单元格进行更改,因此如果我单击 2 个连续单元格的 "like" 按钮,table 视图中的所有单元格都将变为 "unlike"。这是我的 tableViewController:
代码class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 30
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell
cell.tag = indexPath.row
cell.like.tag = indexPath.row
cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside)
return cell
}
@IBAction func handleLikes(sender: AnyObject){
println(sender.tag) // This works, every cell returns a different number and in order.
sender.setTitle("Pressed", forState: UIControlState.Normal)
}
这是我的 TableViewCell 代码 class:
class TableViewCell: UITableViewCell {
@IBOutlet weak var like: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
此外,这无关紧要,但如果有人阅读本文可以告诉我如何改进我的风格 and/or 代码的清晰度,我也将不胜感激。
UITableViewCell
可重复使用。这意味着您必须将每个单元格的标题设置为 "unlike" 或 "like"。最简单的方法是在 ViewController
将此添加到您的 ViewController
:var likes: [String]!
在 ViewDidLoad 中:likes = [String](count: 20, repeatedValue: "like")
请注意,长度应基于您将显示的 UITableViewCells
个数。
你的cellForRowAtIndexPath
:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell
cell.like.tag = indexPath.row
cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside)
cell.like.setTitle(likes[indexPath.row], forState: UIControlState.Normal)
return cell
}
handleLikes
函数:
func handleLikes(sender: AnyObject){
println(sender.tag) // This works, every cell returns a different number and in order.
if likes[sender.tag] == "like" {
likes[sender.tag] = "unlike"
}
else {
likes[sender.tag] = "like"
}
sender.setTitle(likes[sender.tag], forState: UIControlState.Normal)
}