Mus Harlem
Mus Harlem

Reputation: 175

Cannot assign value of type String to type UILabel

I have marked the part of my code where the problem is, it is commented out. The error message is:

Cannot assign value of type String! to type UILabel!.

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SendDataSegue" {
        if let sendToDetailViewController = segue.destinationViewController as? DetailViewController {
            var sendingText = metadataObj.stringValue
            sendToDetailViewController.messageLabelDos = sendingText
        }
    }
}

The label it should be changing is in my DetailViewController and it is a label. The code above is from my original ViewController. How can I make this work?

More code to put in context:

if metadataObj.stringValue != nil {

dispatch_async(dispatch_get_main_queue()) {
    self.performSegueWithIdentifier("SendDataSegue", sender: self)
}

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "SendDataSegue" {
        if let sendToDetailViewController = segue.destinationViewController as? DetailViewController {
            var sendingText = metadataObj.stringValue
            sendToDetailViewController.viaSegue = sendingText
        }
    }
}

Upvotes: 0

Views: 9518

Answers (1)

Nirav D
Nirav D

Reputation: 72410

You need to pass the String instead of setting text to label, because when you correct it and set like this sendToDetailViewController.messageLabelDos.text = sendingText, you will get nil error because messageLabelDos is not initialize yet, so try like this. Create one string instance in DetailViewController and use that inside prepareForSegue for passing String and then use that String instance in viewDidLoad to assign Label to text.

class ViewController: UIViewController { 

    //Your other methods

    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
        if segue.identifier == "SendDataSegue" {
            if let sendToDetailViewController = segue.destinationViewController as? DetailViewController {
                var sendingText = metadataObj.stringValue
                sendToDetailViewController.messageDos = sendingText
            }
        }
    }
}

Inside DetailViewController

var messageDos: String = ""

override func viewDidLoad() {
    super.viewDidLoad()
    self.messageLabelDos.text = messageDos
}

Upvotes: 3

Related Questions