如何为服务器上的表视图单元格中的每个帖子更新"喜欢"按钮



我正在尝试制作像Instagram这样的应用程序。我已经解析了新闻源表中的 json,每个单元格中有 1 个喜欢按钮。当按下这个喜欢按钮时,它应该更新我拥有的 LIKEPOST json 并将喜欢增加 1。我遇到的问题是更新喜欢按钮以喜欢每个单元格的帖子。

我正在附加代码。

这是按下时喜欢按钮的功能。

@IBAction func likeBtnPressed(_ sender: Any) {
if !pressed {
let image = UIImage(named: "Like-1.png") as UIImage!
likeBtn.setImage(image, for: .normal)
pressed = true
} else
{
let image = UIImage(named: "liked.png") as UIImage!
likeBtn.transform = CGAffineTransform(scaleX: 0.15, y: 0.15)
UIView.animate(withDuration: 2.0,
delay: 0,
usingSpringWithDamping: 0.2,
initialSpringVelocity: 6.0,
options: .allowUserInteraction,
animations: { [weak self] in
self?.likeBtn.transform = .identity
},
completion: nil)
likeBtn.setImage(image, for: .normal)
pressed = false
likeUpdateServer()
}
}

这是更新类似功能的功能:

func likeUpdateServer()
{
let userDefaults = UserDefaults.standard
let value  = userDefaults.string(forKey: "api_token")
let api_token : String! = value
let post_id = "9231"
print(api_token)
print(post_id)

var request = URLRequest(url: URL(string: "(URL_BASE)(LIKEPOST)")!)
request.httpMethod = "POST"
let postString = "api_token=(api_token!)&&post_id=(post_id)"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {                                                 // check for fundamental networking error
print("error=(String(describing: error))")
print("cant run")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
print("statusCode should be 200, but is (httpStatus.statusCode)")
print("response = (String(describing: response))")

}
else {
let responseString = String(data: data, encoding: .utf8)
print("responseString = (String(describing: responseString))")
}
}
}

这是我的cellForRowAt 函数:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell : PostDataTableViewCell = self.feedTable.dequeueReusableCell(withIdentifier: "contentViewReuse") as! PostDataTableViewCell
let post = posts[indexPath.row]
print(post)
cell.configureCell(post : post)
return cell
}

如果你的请求参数是正确的,那么在你制作一个dataTask之后,你需要恢复它,所以在likeUpdateServer方法的末尾你应该添加这一行

task.resume()

创建任务后,必须通过调用其resume()方法。

可以使用以下代码查找单元格的索引路径。

let point : CGPoint = sender.convert(.zero, tableView)
let indexPath = tableView!.indexPathForItem(at: point)

将此代码添加到按钮单击方法中,并使用 indexPath 找到 postId。

另外,您应该标记喜欢的单元格(我希望它会从服务器返回(喜欢一个单元格后,您可以在本地发布模型中更新它。

我想我知道你想做什么。

每次用户单击按钮时,您都希望执行 JSON 请求并更新按钮。

如果是这样,您必须创建一个数组或字典,并在其中存储开/关值。在 likeBtnPressed 函数中,检查 tableView 单元格 indexPath.row 并更新该索引处的"开/关"数组中的值。

我认为,您错误地减少了表格视图的单元格。因此,它像在单元格其他中一样重复按钮。您可以在函数单元格中设置真或假单元格行。你检查真假。如果为 true,则显示按钮是否喜欢。

首先,如果 viewController 代码顶部打开了 tableView 按钮,则创建一个数组或字典进行存储:

var buttonStates = [Bool]()

在 viewDidLoad 中,用正确的值填充数组。您还可以发出 JSON 请求以从服务器获取赞

for i in 0..<numberOfPosts {
buttonStates.append(false)
//in my case, all buttons are off, but be sure to implement your own logic here
}

在 likeBtnPressed 函数中,找到 indexPath。最简单的方法是尝试这个:

print(sender.superview?.superview)

如果这不起作用,只需添加更多

print(sender.superview?.superview?.superview)

一旦 print(( 在调试器中输出你的 tableViewCell 类,将其保存在一个常量中

let cell = ...

然后检查索引路径并在 likeBtnPresses 操作中更改按钮状态

if let cellWithClass = cell as? MyClass {
if let indexPath = tableView.indexPath(for: cellWithClass) {
//change button state and make JSON requests here
buttonStates[indexPath.row] = !buttonStates[indexPath.row]
}
}

我建议您然后重新加载表视图

tableView.reloadData()

在单元格中,检查按钮是打开还是关闭

if buttonStates[indexPath.row] {
//on
} else {
/off
}

据我所知,这应该有效(并通过电话😂回复(

最新更新