我正在尝试制作像Instagram这样的应用。我在newsfeed表中解析了json,并且每个单元格中它们都是1个按钮。当按下这个按钮时,它应该更新我拥有的LIKEPOST json并将其增加1.我遇到的问题是更新like按钮,以便像每个单元格的帖子一样。
我正在附加代码。
这是按下时按钮的功能。
@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
}
答案 0 :(得分:2)
如果您的请求参数是正确的,那么在您创建dataTask之后,您需要恢复它,因此在likeUpdateServer
方法结束时您应该添加此行
task.resume()
创建任务后,必须通过调用它来启动它
resume()
方法。
您可以使用以下代码找到单元格的索引路径。
let point : CGPoint = sender.convert(.zero, tableView)
let indexPath = tableView!.indexPathForItem(at: point)
在按钮点击方法中添加此代码,使用indexPath可以找到postId。
此外,你应该标记喜欢的单元格(我希望它将从服务器返回)一旦你喜欢一个单元格,你可以在本地帖子模型中更新它。
答案 1 :(得分:0)
我想我知道你想做什么。
每次用户点击按钮时,您都希望执行JSON请求并更新按钮。
如果是这样,你必须制作一个数组或字典,并在其中存储开/关值。在likeBtnPressed函数中,检查tableView单元格indexPath.row并更新该索引处“on / off”数组中的值。
答案 2 :(得分:0)
我认为,你错误地减少了Tableview的细胞。因此,重复按钮就像在其他单元格中一样。您在单元格的函数cellForRow中设置true或false。你检查是真还是假。如果为true,则显示是否喜欢按钮。
答案 3 :(得分:0)
首先,如果在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类在debuger中,将其保存在常量
中 let cell = ...
然后检查indexPath并更改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
tableView.reloadData()
在cellForRowAt中,检查按钮是否开启
if buttonStates[indexPath.row] {
//on
} else {
/off
}
据我所知(并通过电话回复),这应该有用