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

时间:2017-08-21 06:20:24

标签: ios json swift

我正在尝试制作像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
}

4 个答案:

答案 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
}

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