2017-05-10 91 views
0

我知道有向后传递数据的答案,但它们是连续视图控制器的答案。我有3个视图控制器和一个导航控制器。所有的赛段都是“show segue”。我想将数据从VC3传递给VC1。我试图使用委托,但被卡住:iOS/Swift 3:在非连续视图控制器之间向后传递数据

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个塞格斯。 您的善意帮助将不胜感激。

+0

[unwind segue](https://developer.apple.com/library/content/technotes/tn2298/_index.html)是你需要的所有东西 – Paulw11

+0

所以不能用委托来完成?我的VC3有一个表格视图。每当我点击一个单元格时,我想移动到VC1并将数据传递给它。我不确定我如何放松地做到这一点。 – benh

+0

你可以使用委托,但它更混乱。您需要定义协议并通过不需要它的视图控制器“下线”传递委托。通过使用unwind方法,VC1可以访问故事板segue的'sourceViewController'属性,通过它的unwind方法来获取对VC3的引用。然后它可以从vc3的属性中读取所需的数据 – Paulw11

回答

0

您可以使用如此Apple Tech Note中所示的展开顺序。

。在你的故事板,创造一个放松身心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创建展开操作方法,并访问该丙erty现在

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之间的视图控制器,并用一个简单的开卷SEGUE取回它。

+0

谢谢你的回答。它看起来像从VC3移动到VC1之前完成self.selectedValue有一个值,所以它始终为零。在每个动作之后打印时,我会看到func展开(sender:UIStoryboardSegue)被调用,然后才从tableView函数中看到self.selectedValue的值。 @ Paulw11 – benh

+0

请确保您没有直接从故事板中的tableview行链接unwind segue;它需要是一个程序化的segue,所以你应该从视图控制器对象拖动到出口图标。 – Paulw11

+0

我知道我是***中的一员,我感谢您的耐心,但我认为这就是我所做的:我创建了@IBAction func,然后将表格视图单元格拖到出口处。然后我选择了列表中的动作。然后我给了它一个标识符。那是对的吗? – benh

相关问题