我有一个应用程序设置,有一个Master root viewController,导航栏有一个“设置按钮”。当用户点击设置按钮时,它会显示一个'settingsTableViewController',它不是动态的,而是静态的,因此我可以使用样式等设置格式化tableviews。
在这个设置视图中,我有一个UITextField,它取一个Person的名字。
当用户点击导航栏中的“Done”时,我想将该名称传递回Master Root ViewController,以便我可以在标题中使用它来显示Person的名字。 (我想在驳回视图时传递名称)
我试过使用segue但没有运气。这是我尝试过的一点。
SettingsViewController(popV在MasterVC上方)
var id = target.attr('id'); // jQuery
var id = target.id; // Javascript
MasterTableViewController.swift
class SettingsTableViewController: UITableViewController {
@IBOutlet weak var nameTextfield: UITextField!
@IBAction func done(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
override viewDidLoad(){
self.title = "Settings"
}
// MARK: - Navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Trying to pass what was typed in the textfield to the Root ViewController and store this name in a variable of type String called 'name'
if segue.identifier == "masterView"{
let masterViewController = segue.destinationViewController as! MasterTableViewController
masterViewController.name = nameTextField.text
print("Segue was used")
}
}
}
我的问题是,我做错了什么?我试图使用委托,但我得到nil,数据似乎没有通过任何方式,所以任何线索将大大帮助。感谢
答案 0 :(得分:1)
有一种叫做Unwind Segue的不同类型的segue可以做到这一点。它不会创建新的mvc,而是用于将数据传递回呈现当前数据的vc。这是怎么做的 首先,转到故事板并控制从settingVc拖动到它顶部的退出按钮(自身)。它会给你'选择Segue'并选择IBAction goBack。这意味着如果实现此方法,任何呈现当前vc的vc都将准备好。换句话说,您正在推出一个协议,并且演示者vc将通过实现goBack IBAction来符合。这是如何实现的。在你的Mater vc
//You must have this function before you do the segue in storyboard
@IBAction func goBack(segue: UIStoryboardSegue){
/* this is optional
if let stv = segue.sourceViewController as? SettingsTableViewController{
self.name = stv.nameTextfield?.text
}
*/
}
在你的设置vc(当前vc)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//make sure you set the id of your segue to "Your Go back Unwind segue". ofc u can name it whatever
if segue.identifier == "Your Go back Unwind segue"{
if let mtvc = segue.destinationViewController as? MasterTableViewController{
mtvc.name = nameTextField.text
print("Segue was used")
}
}
}
和完成的方法应该是这样的
@IBAction func doneEditing(sender: UIButton) {
presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}