更改方法内的标签文本

时间:2014-11-30 15:36:01

标签: ios swift

我使用委托从视图控制器传回信息。 这是方法

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

1 个答案:

答案 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方法