我将在这个问题上加上一个事实,即我是一个严格意义上的设计师,涉及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) { }
}
答案 0 :(得分:5)
如果您的SearchViewController
是initial VC
,那么为什么要在其中放置back
按钮?您想要Go Back to
的位置?我认为它不应该存在。
另外,除非您确实需要在Xcode中以编程方式执行操作,否则您应该使用Storyboard
在SearchViewController
内嵌入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!
}
}