将数据从Pop-over ViewController UITextfield传递回Master ViewController

时间:2015-09-26 16:39:02

标签: ios swift segue ios9

我有一个应用程序设置,有一个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,数据似乎没有通过任何方式,所以任何线索将大大帮助。感谢

1 个答案:

答案 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)
}