我使用委托从视图控制器传回信息。 这是方法
func writeValueBack(value: String) {
self.label.text = value
}
该函数被调用,除了标签没有更新外,一切都很好。
标签有一个值,并且没有返回nil,我用这行检查了
println(self.label.text)
它会打印'值'
的值这意味着标签的文字被设置为' value'但它没有更新。
我甚至尝试使用主线程但没有运气
func writeValueBack(value: String) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.label.text = value
})
}
我只是不知道问题所在。
任何帮助都会很棒。
协议:
protocol writeValueBackDelegate {
func writeValueBack(value: String)
}
编辑: 我的视图控制器的代码:
//
// ViewController.swift
// DelegateTesting
//
// Created by Alex Catchpole on 30/11/2014.
// Copyright (c) 2014 Alex Catchpole. All rights reserved.
//
import UIKit
class ViewController: UIViewController, writeValueBackDelegate {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "MainSegue" {
var vc = segue.destinationViewController as SecondViewController
vc.labelText = textField.text
vc.delegate = self
}
}
func writeValueBack(value: String) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.label.text = value
})
}
@IBAction func button(sender: AnyObject) {
self.label.text = textField.text
}
@IBAction func segue(sender: AnyObject) {
performSegueWithIdentifier("MainSegue", sender: self)
}
}
第二个ViewController源:
//
// SecondViewController.swift
// DelegateTesting
//
// Created by Alex Catchpole on 30/11/2014.
// Copyright (c) 2014 Alex Catchpole. All rights reserved.
//
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var textField: UITextField!
var labelText: String!
var delegate: writeValueBackDelegate? = nil
override func viewDidLoad() {
super.viewDidLoad()
label.text = labelText
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func button(sender: AnyObject) {
label.text = textField.text
}
@IBAction func segueBack(sender: AnyObject) {
var editedText = label.text
performSegueWithIdentifier("SecondSegue", sender: self)
if (delegate != nil) {
delegate?.writeValueBack(editedText)
println("working")
}
}
}
答案 0 :(得分:1)
问题出现在你的第二个视图控制器中,正如rdelmar指出的那样,会创建第一个视图控制器的新实例,而不是导航回原始实例。
要解决此问题,您可以使用dismissViewControllerAnimated:completion
而不是执行第二次segue。但是,放松segue会导致更简单的代码,并且可以通过将其添加到您的第一个视图控制器来实现:
@IBAction func unwindFromSecond(unwindSegue: UIStoryboardSegue) {
if let secondViewController = unwindSegue.sourceViewController as? SecondViewController {
label.text = secondViewController.label.text
// Or whatever you need to retrieve data from the second controller
}
}
然后在您的故事板中,从第二个视图控制器创建一个展开segue。例如,如果您有“关闭”按钮,请从此按钮控制拖动到第二个视图控制器场景中的“退出”图标,然后选择unwindFromSecond
。有关详细步骤,请参阅此问题的答案:What are Unwind segues for and how do you use them?
您现在可以删除writeValueBackDelegate
声明和相关变量,writeValueBack
方法和第二个视图控制器的segueBack
方法