我正在尝试从第二个viewController传回数据。 没有NavigationController,我可以做到这一点。但现在我需要使用NavigationController。然后我的代码像以前一样工作。数据不会通过。 这是简单的代码: 在第一个viewController中
class ViewController: UIViewController, backfromSecond {
@IBOutlet weak var text: UILabel!
var string : String?
override func viewDidLoad() {
super.viewDidLoad()
self.string = "Start here"
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
self.text.text = self.string
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? secondViewController{
destinationViewController.delegate = self
}
}
func back(text: String) {
self.string = text
print(text)
}
}
第二个viewController:
protocol backfromSecond {
func back(text: String)
}
class secondViewController: UIViewController {
var string : String = "nothing here"
var delegate : backfromSecond?
override func viewDidLoad() {
super.viewDidLoad()
delegate?.back(text: string)
// Do any additional setup after loading the view.
}
}
这里有什么问题?
答案 0 :(得分:0)
我认为你的问题在于准备segue方法。如果视图控制器在导航堆栈上,我认为您的代码应该类似于
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let destinationViewController = segue.destination as? UINavigationController).topViewController as! secondViewController{
destinationViewController.delegate = self
}
}
答案 1 :(得分:0)
这对我有用。
第一次VC
class ViewController: UIViewController, backfromSecond {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func Passingfrom1stVCTo2ndVC(_ sender: AnyObject) {
if let vc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController3") as? ViewController3{
vc.dataFrom1StVC = "message send from 1st VC"
vc.delegate = self
self.navigationController?.pushViewController(vc, animated: true)
}
}
func back(text: String) {
print("data\(text)")
}
}
第二个VC。
protocol backfromSecond: class {
func back(text: String)
}
class ViewController3: UIViewController {
var dataFrom1StVC : String? = nil
week var delegate : backfromSecond?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func DataSendFrom2ndVCTo1stVC(_ sender: AnyObject) {
self.delegate?.back(text: "Message Send From 2nd vc to 1st VC")
self.navigationController?.popViewController(animated: true)
}
}
我希望它会对你有用。如果有任何问题,请问我,我会帮助你。
答案 2 :(得分:0)
您可以使用展开segue来传回数据。 这是一个教程 https://spin.atomicobject.com/2014/10/25/ios-unwind-segues/
答案 3 :(得分:0)
假设A& B是两个控制器,您首先使用一些数据从A导航到B.现在你想用一些数据从B到A进行POP。
Unwind Segues是最好的推荐方式。 以下是步骤。
定义以下方法
@IBAction func unwindSegueFromBtoA(segue:UIStoryNoardSegue){
}
打开故事板
选择B ViewController并单击ViewController outlet。按下控制键并拖动到“退出”键。插座,让鼠标留在这里。在下图中,所选图标为ViewController插座,最后一个带退出标志的图标为Exit Outlet。
您将看到“unwindSegueFromBtoA'弹出窗口中的方法。选择此方法。
现在,您将在左侧的视图控制器层次结构中看到一个segue。您将在下面的图片中看到您在StoryBoard Entry Piont附近创建的segue。
选择此项并为其设置标识符。 (建议设置与方法相同的名称 - unwindSegueFromBtoA)
开放B.m.现在,无论您想要弹出哪个A.使用
self.performSegueWithIdentifier(" unwindSegueFromBtoA",sender:dataToSend)
现在,当您弹出' A',' unwindSegueFromBtoA'方法将被调用。在' A'的unwindSegueFromBtoA中您可以访问' B'
那就是......!