Swift准备Segue:如何知道如果一个按钮或表格行启动Segue

问题描述:

这是我的代码。我正在尝试执行一个赛格。我有一个酒吧按钮项目以及一个行表执行相同的赛格表。我想知道按钮被点击的时间和特定行的时间。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") 
} 

OR

当你调用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了。您也可以在故事板中创建一个segue,方法是右键单击该单元并拖动到视图控制器,然后删除didSelectRow实现。