【问题标题】:Swift prepare for Segue: How to know If a button or a table row initiated SegueSwift 为 Segue 做准备:如何知道按钮或表格行是否启动了 Segue
【发布时间】:2017-06-24 01:41:18
【问题描述】:

这是我的代码。我正在尝试执行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
            }
        }

    }
}

【问题讨论】:

    标签: ios swift segue


    【解决方案1】:

    只需将索引路径传递为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
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      var isSegueFromCell:Bool = false

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

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

      当您调用 performSegue 时,如果从您的 didSelectRow 方法调用,则可以传入一个 Bool 指示 true

      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")
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

        一个简单的事情是检查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 实现。

        【讨论】:

          猜你喜欢
          • 2014-07-25
          • 1970-01-01
          • 1970-01-01
          • 2015-10-21
          • 1970-01-01
          • 1970-01-01
          • 2017-10-21
          • 2018-05-28
          • 1970-01-01
          相关资源
          最近更新 更多