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

标签 ios swift segue ios9

我有一个应用程序设置有一个主根 viewController 和一个带有“设置按钮”的导航栏。当用户点击设置按钮时,它会弹出一个不是动态的而是静态的“settingsTableViewController”,因此我可以使用样式等设置来格式化表格 View 。

在此设置 View 中,我有一个采用人名的 UITextField。

当用户单击导航栏中的“完成”时,我想将该名称传递回主 Root View Controller ,以便我可以在标题中使用它来显示人物的姓名。 (我想在关闭 View 时传递名称)

我曾尝试使用 segue,但没有成功。这是我尝试过的一些方法。

SettingsViewController(在 MasterVC 上弹出)

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")
    }

}

}

MasterTableViewController.swift

 class MasterTableViewController: UITableViewController {

  var name: String!

  // I am trying to then display the name entered in the pop-over view in this root view controller's title

  override viewDidLoad(){
  self.title = name!
  }
 }

我的问题是,我做错了什么?我曾尝试使用委托(delegate),但我得到的结果为零,而且数据似乎没有以任何一种方式传递,因此任何线索都会有很大帮助。谢谢

最佳答案

有一种叫做 Unwind Segue 的不同类型的 segue 可以做到这一点。它不会创建新的 mvc,它用于将数据传回呈现当前 mvc 的 vc。这是怎么做的 首先,转到您的 Storyboard并控制从 settingVc 拖动到它顶部的退出按钮(到它自己)。它会给你'Selection Segue'并选择IBAction goBack。这意味着任何呈现当前版本的 vc 都将在实现此方法时做好准备。换句话说,您正在发布一个协议(protocol),演示者 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")
        }
    }
}

done方法应该是这样的

@IBAction func doneEditing(sender: UIButton) {
    presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
}

关于ios - 将数据从 Pop-over ViewController UITextfield 传回 Master ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32799452/

相关文章:

ios - Azure 通知中心按设备筛选标记

ios - SwiftUI 不释放列表中已删除单元格的内存

swift - 完成处理程序无法关闭 popAlertController

ios - 具有约束的 Swift 协议(protocol)扩展不会使类符合该协议(protocol)

ios - 快速自定义 map 类

ios - Xcode 快速删除按钮

ios - 从 Parse 下载后使用图像或文本进行排序

swift - 允许程序从 Swift 中的标准输入或参数读取

ios - 追加从不同 View Controller 创建的新对象执行segue

ios - 未加载来自 segue 的 UIPickerView 项目