Swift 3 - 将数据从一个视图传递到另一个视图

问题描述:

我将以一个事实说明这个问题,我严格是一个涉及xcode的设计师。我试图建立一个'愚蠢的'原型。Swift 3 - 将数据从一个视图传递到另一个视图

我想设置2个VC。第一个VC有一个文本字段,允许用户键入一个搜索参数,当点击“返回”时,它应该将该参数传递给下一个VC。在这个特定的VC上,我还在导航栏中设置了“返回”按钮。

我遇到的问题是我无法获得第一个VC的后退按钮的代码,以便与传递变量的代码一起使用。它会导致应用程序在任何时候碰到第一个视图控制器上的后退按钮时崩溃。 Xcode注意到问题出在代码中传递变量的地方。这是两个VC的代码。

import UIKit 

class SearchViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var searchText: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) 
    self.navigationController?.navigationBar.shadowImage = UIImage() 
    self.navigationController?.navigationBar.isTranslucent = true 
    searchText.delegate = self 
    searchText.becomeFirstResponder() 
    // Do any additional setup after loading the view. 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    var destinationController = segue.destination as! ResultsViewController 
    destinationController.searchItem = searchText.text! 
} 

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
    if searchText.text != "" { 
     performSegue(withIdentifier: "resultsSegue", sender: self) 
     textField.resignFirstResponder() 
     return false 
    } 

    // self.view.endEditing(true) 

    return true 
} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

override func viewWillAppear(_ animated: Bool) 
{ 
    super.viewWillAppear(animated) 
    self.navigationItem.hidesBackButton = true 
} 



} 

结果视图控制器的代码是

import UIKit 

class ResultsViewController: UIViewController { 

@IBOutlet weak var userSearchInputLabel: UILabel! 
@IBAction func btnReturnToSearch(_ sender: Any) { 
    performSegue(withIdentifier: "segueBackToSearch", sender: self) 
} 


var searchItem = String() 



override func viewDidLoad() { 

    super.viewDidLoad() 
    userSearchInputLabel.text = searchItem 
    self.extendedLayoutIncludesOpaqueBars=true; 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

override func viewWillAppear(_ animated: Bool) 
{ 
    super.viewWillAppear(animated) 
    self.navigationItem.hidesBackButton = true 
} 

@IBAction func unwindToResults(segue:UIStoryboardSegue) { } 

} 

如果您SearchViewControllerinitial VC那么为什么你把back按钮呢?你想要的地方Go Back to?我认为它不应该在那里。
此外,除非你真的需要做的事情编程在Xcode中,您应该只使用Storyboard做嵌入SearchViewControllerNavigationController(从菜单中选择Controller则:Editor-> Embed in -> Navigation Controller)。

然后创建segueSearchViewControllercontroller icon on the topResultViewController,你可以为segue集标识符像你已经知道(如你在代码中使用它)。
在您的ResultViewController中,如果您已经完成了上述步骤,那么您不需要button代替returnToSearch,您可以删除@IBAction for btnReturnToSearch(_ sender: Any)。因为您将获得ResultViewController顶部的<Back按钮作为Navigation Item以免费返回到SearchVeiwController

***更新根据最新评论****
好的。我终于明白你的问题。在你的准备(为:发件人)。你需要 。检查Segue公司标识:

if segue.identifier == "CHANGE_ME_WITH_YOUR_SEGUE_FOR_RESULT_IDENTIFIER" { 
... 
} 

你传下去的搜索结果之前。 ResultViewController。因为当你退回时,你不会去ResultViewController,而是MainViewController

+0

SearchViewController不是初始视图。搜索VC会连接到它之前的一个主要VC。我只是试图将导航控制器嵌入到结果视图控制器中。所以现在搜索和结果VC都有导航控制器。但是,当我尝试将搜索VC中输入的值传递给结果VC时,该应用仍然崩溃。当我注释掉这些代码行时,它可以正常工作(虽然没有传递任何信息) –

+0

控制台正在给我这些信息“无法将'UINavigationController'类型的值(0x1066124e8)转换为'Application11.ResultsViewController' –

+0

请提供您的项目的最小内容仍会崩溃。否则,将很难帮助您调试问题。 – Gray

其实我看到我做错了。由于在我的搜索视图控制器中有多个赛段,因此在执行将数据传递到结果视图控制器的赛格之前,我需要对赛格标识名称进行检查。因为我没有这个检查,导致应用程序崩溃。现在我只需要弄清楚如何阻止我的标签栏导航消失...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "resultsSegue" { 
    let destVC = segue.destination as! UINavigationController 
    let destinationController = destVC.topViewController as! ResultsViewController 
    destinationController.searchItem = searchText.text! 
    } 
}