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

时间:2017-06-18 12:18:08

标签: ios swift3 xcode8

我将在这个问题上加上一个事实,即我是一个严格意义上的设计师,涉及xcode。我正在尝试构建一个'哑'原型。

我正在尝试设置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) { }

}

2 个答案:

答案 0 :(得分:5)

如果您的SearchViewControllerinitial VC,那么为什么要在其中放置back按钮?您想要Go Back to的位置?我认为它不应该存在。
另外,除非您确实需要在Xcode中以编程方式执行操作,否则您应该使用StoryboardSearchViewController内嵌入NavigationController(从菜单中选择Controller:{{1 }})。

然后从Editor-> Embed in -> Navigation Controller的{​​{1}}到segue创建controller icon on the top,您就可以设置SearchViewController的标识符,就像您已经知道的那样(因为您在码)。
ResultViewController中,如果您已完成上述步骤,则segue不需要ResultViewController,您可以删除button。您将在returnToSearch的顶部获得@IBAction for btnReturnToSearch(_ sender: Any)按钮<Back,以免费返回Navigation Item

***根据上次评论更新****
好的。我终于理解了你的问题。在你的准备中(for:sender)。你需要 。检查Segue标识符:

ResultViewController
在将搜索结果传递给之前

。 ResultViewController。当你退回时,你不会去SearchVeiwController而是if segue.identifier == "CHANGE_ME_WITH_YOUR_SEGUE_FOR_RESULT_IDENTIFIER" { ... }

答案 1 :(得分:0)

其实我看到我做错了什么。由于我的Search View Controller中有多个segue,因此我需要在执行将数据传递给Results View Controller之前的segue时检查segue标识符名称。因为我没有检查,导致应用程序崩溃。现在我只需弄清楚如何阻止我的标签栏导航消失......

 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!
    }
}