【问题标题】:iOS/Swift 3: Passing data backwards between non consecutive View ControllersiOS/Swift 3:在非连续视图控制器之间向后传递数据
【发布时间】:2017-05-10 22:03:28
【问题描述】:

我知道向后传递数据有一些答案,但它们适用于连续的视图控制器。我有 3 个视图控制器和一个导航控制器。所有转场都是“显示转场”。我想将数据从 VC3 传递到 VC1。我正在尝试使用委托,但卡住了:

    protocol Delegate:class {
        func getCityId(with id: String)
    }


    Class VC3:UIViewController{
     weak var delegate: Delegate?
    let id:String?

     func passDataBackwards() {

            delegate?.getCityId(with: self.id!)

    }

  }  
    Class VC1:UIViewController, Delegate{
     func getCityId(with id: String) {
            print ("id from search: \(id)")

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc3 = (segue.destination as! VC3)
          vc3.delegate = self
       }
   }

我的问题是我的源和目标之间有 2 个 segues。 您的帮助将不胜感激。

【问题讨论】:

  • 你只需要一个unwind segue
  • 所以不能使用委托来完成?我的 VC3 有一个表格视图。每当我单击一个单元格时,我都想移动到 VC1 并将数据传递给它。我不确定如何通过 unwind 来做到这一点。
  • 您可以使用委托,但它更混乱。您需要定义协议并通过不需要它的视图控制器“下线”传递委托。通过使用 unwind 方法,VC1 可以访问故事板 segue 的 sourceViewController 属性,并通过其 unwind 方法获取对 VC3 的引用。然后它可以从 vc3 的属性中读取所需的数据
  • 谢谢你,保罗。如何将表格视图单元格连接到出口? @Paulw11

标签: ios swift segue


【解决方案1】:

您可以使用如Apple Tech Note 中所示的展开转场。

在您的故事板中,创建一个如技术说明中所示的 Unwind segue 并为其指定一个标识符,例如“unwindToVC1”

在 VC3 中,创建一个属性来存储所选值并使用表的 didSelectRowAt 函数中的 performSegue 来调用它,首先将所选值存储在属性中:

class VC3: UIViewController {

   var selectedValue: YourValueType?

   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       self.selectedValue = myData[indexPath.row]
       self.performSegue(withIdentifier: "unwindToVC1", sender: self)
    }
}

VC1中创建一个unwind动作方法并访问该属性

class VC1: UIViewController {

    @IBAction func unwind(sender: UIStoryboardSegue) {
        if let sourceVC = sender.sourceViewController as? VC3 {
            if let selectedValue = sourceVC.selectedValue {
                // Do something with the selected value
            }
        }
    }
}

现在您可以在当前 VC 和 VC1 之间拥有任意数量的视图控制器,并通过简单的展开转场回到它。

【讨论】:

  • 感谢您的热心回答。看起来从 VC3 移动到 VC1 是在 self.selectedValue 有值之前完成的,所以它总是为零。在每次操作后打印时,我看到调用了 func unwind(sender: UIStoryboardSegue) ,然后我才从 tableView 函数中看到 self.selectedValue 的值。 @Paulw11
  • 确保您没有直接从情节提要中的 tableview 行链接展开 segue;它需要是一个程序化的 segue,所以你应该从视图控制器对象拖动到退出图标。
  • 我知道我很痛苦,感谢您的耐心,但我认为这就是我所做的:我创建了一个 @IBAction 函数,然后拖动了一个表格视图单元格到出口。然后我从列表中选择了操作。然后我给了它一个标识符。对吗?
  • 不,不是从表格视图单元格中退出,而是从橙色视图控制器中退出;您需要创建一个可以以编程方式触发的 segue
  • 直到现在我才知道这个选项。它工作得很好。保罗,你总是很善良,超级专业。即使我们是陌生人,您的帮助也不会被视为理所当然,谢谢。 @Paulw11
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多