首页 > 解决方案 > 单击触发打开另一个VC的按钮时如何将按钮的sender.tag传递给另一个VC

问题描述

我正在使用一个自定义的 tableView 单元,它在 VC1 中有一个按钮和一些标签。我想要做的是当我连续单击按钮时,然后打开 VC2 并将当前标签的文本(名称 [i])发送到 VC2。

但就我而言,我坚持如何在 pressButton func 中传递 buttonTag 来准备 func controller.playingSong = names[buttonTag]。我尝试使用全局变量,然后每次 prepare() 检索该变量,但它没有工作属性,似乎 prepare() 将在 pressButton() 方法之前执行。

好吧,我确实搜索了很多但没有得到解决方案,我可以将prepare()结合到我的pressButton()中,换句话说,使用segue时是否需要prepare?

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myTableView: UITableView!
    let REUSE_ID = "CustomCell"
    var names = ["first", "second", "third"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func pressButton(_ sender: UIButton) {
        let buttonTag = sender.tag
    }

}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return names.count
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: REUSE_ID, for: indexPath) as! CustomCell

        cell.myButton.tag = indexPath.row
        cell.songName.text = names[indexPath.row]
        // cell.myButton.addTarget(self, action: #selector(self.pressButton(_:)), for: .touchUpInside)

        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
            case "playingSongs":
                let controller = segue.destination as! OpenedVC
                controller.playingSong = names[buttonTag]
            default: break
        }
    }
}

标签: swiftbuttontableviewsegue

解决方案


听起来您正在将 segue 附加到您的按钮。您可以这样做,或使用按钮 IBAction。如果您同时执行这两种操作,我认为它无法正常工作,这可能是您遇到的问题。

如果您的按钮按下触发 IBAction,您可以从 sender 参数中获取按钮标签到操作,然后让您的 IBAction 代码实例化视图控制器并在显示之前将视图控制器的属性设置为发送者标签。

如果您想将 segue 附加到按钮,则该prepare(for:sender:)方法将在 sender 参数中传递按钮。然后,您可以尝试将 sender 转换为 `UIButton,如果转换成功,则获取按钮的标签并将其传递给目标视图控制器。像这样的东西:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier {
        case "playingSongs":
            if let sendingButton = sender as? UIButton,
               let controller = segue.destination as? OpenedVC { //Don't use a force-cast
                 let buttonTag = sendingButton.tag
                 controller.playingSong = names[buttonTag]
            }
        // The rest of your code to follow
     }
}

编辑:

我通过将if let可选绑定中的两个强制转换更改为 use 来修复上面的代码as?

请注意,您应该避免强制转换 ( as!),因为如果失败,它会导致崩溃。


推荐阅读