在 FirstVC 中选择单元格后,如何为 SecondVC 中的每个单元格调用按钮操作?

Posted

技术标签:

【中文标题】在 FirstVC 中选择单元格后,如何为 SecondVC 中的每个单元格调用按钮操作?【英文标题】:How to call button action for each cell in SecondVC after selecting cell in FirstVC? 【发布时间】:2019-05-13 20:55:13 【问题描述】:

我有两个具有两个不同表视图的视图控制器,其中 FirstVC 使用 segue 将数据发送到 SecondVC。我有来自 json 文件的数据,一切正常。我在 SecondVC (称为 likeButton) 中有一个按钮,当按下它以显示“喜欢的图像”并再次按下时,它会返回到“不喜欢”的正常图像。我实现了这一点并且工作正常。还将数据发送回显示图像“喜欢”的 FirstVC。我使用了 UserDefaults。我的问题是,当您按下按钮以在 SecondVC 中显示“喜欢图像”时在 likeButtonAction(_ sender: UIButton) 函数中,它在每个单元格中都被按下。我需要为那个特定的单元格选择。 我还是 Xcode 的新手。任何帮助都感激不尽。谢谢

这就是我所拥有的:第一个视图控制器

import UIKit

class FirstVC: UIViewController, UITableViewDataSource, UITableViewDelegate 
    let defaults = UserDefaults.standard

    @IBOutlet weak var tableView: UITableView

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "popDetails" 
            guard let vc = segue.destination as? DetailsViewController,
                let index = tableView.indexPathForSelectedRow?.row
            else 
                return
            

            vc.cocktailsName = drinks[index].cocktailName
            // more data send
        
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return drinks.count
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        tableView.rowHeight = 260

        let cell = tableView.dequeueReusableCell(withIdentifier: "favoriteCell") as! TableViewCell

        cell.cocktailLabel.text = drinks[indexPath.row].cocktailName

        selectedValue = defaults.value(forKey: "myKey") as! String

        if selectedValue == "true" 
            cell.heartImage.image = UIImage(named: "heart")
         else if selectedValue == "false" 
            cell.heartImage.image = UIImage(named: "transparent")
        

        return cell
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        DispatchQueue.main.async 
            self.performSegue(withIdentifier: "popDetails", sender: self)
        
    

第二个视图控制器:

var selectedValue = String()

class SecondVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextViewDelegate 
    var cocktailsName: String!

    @IBOutlet weak var tableView: UITableView!

    var mainCocktails: Cocktails!
    var tap = UITapGestureRecognizer()
    var defaults = UserDefaults.standard
    var checked = false

    @IBAction func done(_ sender: AnyObject) 
        dismiss(animated: true, completion: nil)
    

    @IBAction func likeButtonAction(_ sender: UIButton) 
        if checked 
            sender.setImage(UIImage(named:"likeButton"), for: UIControl.State.normal)
            checked = false
         else 
            sender.setImage(UIImage(named:"likeButtonOver"), for: UIControl.State.normal)
            checked = true
        

        selectedValue = String(checked)
        defaults = UserDefaults.standard
        defaults.set(selectedValue, forKey: "myKey")
        defaults.synchronize()
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "buttonsCell") as! MainPictureViewCell

        cell.nameLabel.text = cocktailsName
        selectedValue = self.defaults.value(forKey: "myKey") as! String

        if selectedValue == "true" 
            cell.likeButton.setImage(UIImage(named: "likeButtonOver"), for: .normal)
         else if selectedValue == "false" 
            cell.likeButton.setImage(UIImage(named: "likeButton"), for: .normal)
        
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 4
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

【问题讨论】:

目前你关心的是 1 var selected / not 但是这应该与 indexPath 相关联,以便它影响 1 cell ,所以在你转到第二个 vc 之前,请参考最后一次点击的 indexPath 跨度> 【参考方案1】:

您将按钮放在单元格中并在单元格控制器中制作插座。然后你必须将目标添加到 cellForRowAt 中的按钮,并将 indexpath.row 的标签提供给按钮

extension ViewController: UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 10


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableCell") as! TableCell
    cell.button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
    cell.button.tag = indexPath.row
    return cell

//MARK:- Handel  Button
@objc func buttonPressed(sender:UIButton)
    print(sender.tag)


【讨论】:

我需要点击的按钮在SecondVC而不是第一个。 您必须为按钮设置标签,当您点击按钮时,该标签将成为索引路径将访问标签和标签 = indexpath,因此如果您可以共享图像,图像将仅针对该索引进行更改我可以更准确地提供帮助

以上是关于在 FirstVC 中选择单元格后,如何为 SecondVC 中的每个单元格调用按钮操作?的主要内容,如果未能解决你的问题,请参考以下文章

在点击不可选择的单元格后取消选择以前选择的 UICollectionViewCells

为啥以编程方式选择单元格后 - 单元格不是交互?

poi Java生成excel合并单元格后字体居中

自定义 UITableView 单元格 Nib 文件仅在选择单元格后显示?

如何为 uicollectionview 制作“选择环”?

如何为集合视图单元格使用图像选择器