我正在使用Swift开发一个iOS应用程序,并且我有一个视图控制器,可以通过选择单元一行或在该单元行的内容视图中选择单元一行或选择一个按钮来从表查看单元格内容视图中获取。。包含表视图的原始视图控制器在两种不同的情况您按表图单元格中内容视图内的按钮。在第一个segue中,当我覆盖第一个segue时,我能够通过if let indexPath = self.tableview.indexPathForSelectedRow
选择的单元一行。但是,当我尝试通过选择的第一个segue时,当您按下按钮时发生的第二个segue时,它不起作用时。这是因为表查看单元格中的按钮不知道在其中选择了哪一行?如果是这样,我该如何解决此问题,如果不是,什么是解决此类问题的可行解决方案?提醒:当您选择一个单元一行时," playdrill" segue被触发,当您在同一单元行的内容视图
第一个segue的代码,当您选择一个单元一行(根据需要进行功能功能)时发生:
class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "playDrill" {
if let indexPath = self.tableView.indexPathForSelectedRow {
if initialRow == 1 {
drillVid = videoURL[indexPath.row]
playerViewController = segue.destination as! PlayerController
playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid))
playerViewController.player?.play()
print(indexPath) //prints correct value which is "[0,6]"
}
if initialRow == 3 {
drillVid = videoUrl[indexPath.row]
playerViewController = segue.destination as! PlayerController
playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid))
playerViewController.player?.play()
}
第二个segue的代码在您选择单元格内容视图内的一个按钮时触发的代码(我希望此segue具有 indexPath
的值,如第一个segue,但是当我尝试使用该代码时,它不会返回正确的值):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Tips" {
if let indexPath = self.tableview.indexPathForSelectedRow {
if initialRow == 1 {
print(indexPath) //the value printed is "6", I want "[0,6]" like the first code block
let tipVC = segue.destination as! KeysController
}
}
}
}
我在几个月前也遇到了这个问题...最后,我能够通过以下任务解决它:
-
在相应的
TableViewCell
中创建按钮的插座和操作 在您的
TableViewCell.swift
文件中创建XYTableViewCellDelegate
协议定义您以前创建的
TableViewCell
委托的委托在您的TableViewCell
类中定义您的tableview
cellForRowAt:
功能中的委托将委托人添加到您的ViewController类中,其中也实现了tableView
最后,只需在您的ViewController中创建此功能即
如果您需要更多帮助,请复制/粘贴整个ViewController&TableViewCell类 - 我们可以直接在代码中进行更改。
它应该看起来像以下代码:
// FILE VIEWCONTORLLER
// -> 5.
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, XYTableViewCellDelegate {
// ... view did load stuff here
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:TripDetailsTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell
// -> 4.
cell.delegate = self
// ...
}
// -> 6.
func buttonTappedViewCellResponse(cell: UITableViewCell) {
let indexPath = tableView.indexPath(for: cell)
// do further stuff here
}
}
// FILE TABLEVIEWCELL
// -> 2.
protocol XYTableViewCellDelegate {
func buttonTappedViewCellResponse(cell:UITableViewCell)
}
class XYTableViewCell: UITableViewCell {
// -> 1.
@IBOutlet weak var button: UIButton!
// -> 3.
var delegate: XYTableViewCellDelegate?
// -> 1.
@IBAction func buttonAction(_ sender: Any) {
self.delegate?.buttonTappedViewCellResponse(cell: self)
}
}
您无法获得所选单元的所选索引,因为您实际上没有选择单元格。您正在按下单元格内的按钮。
因此,您要做的就是获取对按钮的引用,获取按钮的监督(单元格),然后您可以获取该单元格的indexPath
。
class TableViewController: UITableViewController {
var indexPathForButton: IndexPath?
@IBAction func buttonPressed(_ sender: UIButton) {
let button = sender
let cell = button.superview!.superview! as! MyCell // The number of levels deep for superviews depends on whether the button is directly inside the cell or in a view in the cell
indexPathForButton = tableView.indexPath(for: cell)
}
然后在prepare(for segue:)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Tips" {
if initialRow == 1 {
print(indexPathForButton)
let tipVC = segue.destination as! KeysController
}
}
}
我从未使用过 tableview.indexPathForSelectedRow
(我认为这不是一个好练习,但我不确定它是否负责您的问题),但是您可能尝试发送的另一种方法是发送indexPath
对象为sender
。这将避免在prepareForSegue
内检查tableview.indexPathForSelectedRow
。例如,
- 您可以在
tableView(UITableView, didSelectRowAt: IndexPath)
中触发"playDrill"
segue,其中您可以访问此indexPath
,可以将其作为sender
。
。 - 触发
"Tips"
SEGUE时,您还可以将此indexPath
对象作为发件人传递。具有参考的一种方法是在排出单元格并在ableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)
中设置按钮操作时保留indexPath
对象。
让我知道这是否对您有帮助!欢呼,
朱利安