gpt4 book ai didi

swift - 单击触发打开另一个 VC 的按钮时如何将按钮 sender.tag 传递给另一个 VC

转载 作者:行者123 更新时间:2023-11-30 10:36:02 25 4
gpt4 key购买 nike

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

但就我而言,我坚持如何在 pressButton 函数中传递 buttonTag 来准备 func controller.playingSong = names[buttonTag]。我尝试使用全局var,然后每次prepare()检索该var,但它不起作用,似乎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
}
}
}

最佳答案

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

如果您的按钮按下触发了 IBAction,您可以从 sender 参数获取按钮标记到操作,然后让 IBAction 代码实例化 View Controller ,并在之前将 View Controller 的属性设置为发送者标记显示它。

如果您想将 Segue 附加到按钮,则 prepare(for:sender:) 方法将在 sender 参数中传递该按钮。然后,您可以尝试将 sender 强制转换为 UIButton,如果强制转换成功,则获取按钮的标签并将其传递到目标 View Controller 。像这样的事情:

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 可选绑定(bind)中的两个强制转换更改为使用 as? 来修复了上面的代码。

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

关于swift - 单击触发打开另一个 VC 的按钮时如何将按钮 sender.tag 传递给另一个 VC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com