Swift为Segue做准备:如何知道启动按钮或表行是启动的



这是我的代码。我正在试图执行一个。我有一个条按钮项以及一排排,行执行相同的segue。我想知道何时单击按钮以及特定行何时。

以下代码适用于按钮,但对表的行不适用于

的行
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    activePlaceRow = indexPath.row
    performSegue(withIdentifier: "toMap", sender: nil)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toMap"
    {
        let mapViewController = segue.destination as! ViewController
        if let senderObject = sender
        {
            if (senderObject as! UIBarButtonItem).tag == 1
            {
                mapViewController.activePlaceRow = -2
            }
            else
            {
                mapViewController.activePlaceRow = activePlaceRow
            }
        }
    }
}

只需通过 sender

将索引路径传递
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "toMap", sender: indexPath)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toMap"
    {
        let mapViewController = segue.destination as! ViewController
        if let buttonItem = sender as? UIBarButtonItem, buttomItem.tag == 1 {
            mapViewController.activePlaceRow = -2
        }
        else if let indexPath = sender as? IndexPath {
            mapViewController.activePlaceRow = indexPath.row
        }
    }
}

您可以做的就是将属性添加到UIViewController

var isSegueFromCell:Bool = false

在您的didSelectRowAt方法中,您可以将此值分配为true。然后,当调用prepareForSegue方法时,您检查:

if isSegueFromCell {
    print("SEGUE FROM TABLE VIEW")
}
else {
    print("SEGUE FROM BUTTON")
}

呼叫performSegue时,您可以通过Bool传递,指示true,如果从您的didSelectRow方法调用

performSegue(withIdentifier: "YourSegueID", sender: true)

然后在您的prepareForSegue方法

中检测到这一点
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let value = sender as? Bool {
        if value {
            print("FROM TABLE VIEW ROW")
        } else {
            print("FROM BUTTON")
        }
    }
}

一件简单的事情是检查indexPathForSelectedRowindexPathsForSelectedRows

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toMap"
{
    let mapViewController = segue.destination as! ViewController
    if let senderObject = sender
    {
        if (senderObject as! UIBarButtonItem).tag == 1
        {
            mapViewController.activePlaceRow = -2
        }
        else
        {
            mapViewController.activePlaceRow = tableView.indexPathForSelectedRow
        }
    }
}

这种方式不需要activePlaceRow。您还可以通过右键单击单元格并拖动到视图控制器,然后删除您的didSelectRow实现。

最新更新