Ios 为什么我不能用Swift中从一个UIViewController传递到另一个UIViewController(在console works中打印数据)的数据设置标签?

Ios 为什么我不能用Swift中从一个UIViewController传递到另一个UIViewController(在console works中打印数据)的数据设置标签?,ios,swift,uiviewcontroller,segue,Ios,Swift,Uiviewcontroller,Segue,在我的应用程序中,我在一个容器中嵌入了一个UIViewController。在我的故事板中,我向这个viewcontroller添加了一个触摸事件,并调用了segue:fullRequestSegue 然后在我写的UIViewController代码中: class RequestDetails: UIViewController, ShowRequestDetailsFromMap { var fullRequestDetails: FullRequestFromMap? override

在我的应用程序中,我在一个容器中嵌入了一个UIViewController。在我的故事板中,我向这个viewcontroller添加了一个触摸事件,并调用了segue:
fullRequestSegue

然后在我写的UIViewController代码中:

class RequestDetails: UIViewController, ShowRequestDetailsFromMap {

var fullRequestDetails: FullRequestFromMap?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "fullRequestSegue"){
    fullRequestDetails?.changeEventDescr(self.descr, username: "adam", number: "12", created_at: self.created_at, photo: self.photo)

        fullRequestDetails = segue.destinationViewController as? FullRequestFromMap
        fullRequestDetails!.showRequestDetails = self      
    }
}
}
然后在我的类
FullRequestFromMap
中,我有:

protocol ShowRequestDetailsFromMap {
    func changeEventDescr(text:String)
}

class FullRequestFromMap: UIViewController{

@IBOutlet weak var userNumber: UILabel!
var showRequestDetails:ShowRequestDetailsFromMap?
override func viewDidLoad() {
    super.viewDidLoad()
}

func changeEventDescr(description: String, username: String, number: String, created_at: NSDate, photo: String) {

    print(username)
    print(description)
    print(number)
    print(created_at)
    print(photo) //that works fine, I see all valid data in the console

    userNumber.text = number //doesn't work, I see empty label instead of filled with passed data, the same problem is with other labels

}

这里有什么问题?

问题是当调用方法
changeEventDescr
时,
userNumber
标签未初始化。您正在尝试分配给nil对象

FullRequestFromMap
类中创建一个字符串变量,并在其中存储文本,在
viewDidLoad
方法中,必须将文本分配给
userNumber
标签

class FullRequestFromMap: UIViewController {
    @IBOutlet weak var userNumber: UILabel!
    var showRequestDetails:ShowRequestDetailsFromMap?

    var userNumberLabelText:String = "Default Value"

    override func viewDidLoad() {
        super.viewDidLoad()

        userNumber.text = userNumberLabelText
    }

    func changeEventDescr(description: String, username: String, number: String, created_at: NSDate, photo: String) {

        print(username)
        print(description)
        print(number)
        print(created_at)
        print(photo)

        userNumberLabelText = number // Here you set the class variable, not the label it self
    }
}

class RequestDetails: UIViewController {
    ......

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "fullRequestSegue") {
            fullRequestDetails = segue.destinationViewController as? FullRequestFromMap

            // Option 1: You can directly assign it
            fullRequestDetails?.userNumberLabelText = "12"

            // Option 2: You can call your method
            fullRequestDetails?.changeEventDescr(self.descr, username: "adam", number: "12", created_at: self.created_at, photo: self.photo)
        }
    }
}

问题是当调用方法
changeEventDescr
时,
userNumber
标签未初始化。您正在尝试分配给nil对象

FullRequestFromMap
类中创建一个字符串变量,并在其中存储文本,在
viewDidLoad
方法中,必须将文本分配给
userNumber
标签

class FullRequestFromMap: UIViewController {
    @IBOutlet weak var userNumber: UILabel!
    var showRequestDetails:ShowRequestDetailsFromMap?

    var userNumberLabelText:String = "Default Value"

    override func viewDidLoad() {
        super.viewDidLoad()

        userNumber.text = userNumberLabelText
    }

    func changeEventDescr(description: String, username: String, number: String, created_at: NSDate, photo: String) {

        print(username)
        print(description)
        print(number)
        print(created_at)
        print(photo)

        userNumberLabelText = number // Here you set the class variable, not the label it self
    }
}

class RequestDetails: UIViewController {
    ......

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if (segue.identifier == "fullRequestSegue") {
            fullRequestDetails = segue.destinationViewController as? FullRequestFromMap

            // Option 1: You can directly assign it
            fullRequestDetails?.userNumberLabelText = "12"

            // Option 2: You can call your method
            fullRequestDetails?.changeEventDescr(self.descr, username: "adam", number: "12", created_at: self.created_at, photo: self.photo)
        }
    }
}

您可以这样尝试alloc和init该类:-var showRequestDetails:ShowRequestDetailsFromMap=ShowRequestDetailsFromMap()=>然后它可能会工作..尝试一下..好的,我尝试过了,但我得到了这个错误,在控制台中获取该数字的日志值?你调试过吗?我的问题是,即使我在方法
changeEventDescr
中写入
userNumber.text=“aaaa”
,标签也不会得到更新。。。我不知道这里可能会出现什么问题您尝试alloc并初始化该类,如下:-var showRequestDetails:ShowRequestDetailsFromMap=ShowRequestDetailsFromMap()=>然后它可能会工作..尝试一下..好的,我尝试了,但我得到了这个错误,在控制台中获取该数字的日志值吗?你调试过吗?我的问题是,即使我在方法
changeEventDescr
中写入
userNumber.text=“aaaa”
,标签也不会得到更新。。。我不知道这里可能有什么问题等等,我希望我能清楚地理解它-我是否应该创建一个随机字符串变量(
var text=“sth”
),然后在viewdilad()中将它分配给我的标签(
userNumber.text=text
)然后将行
userNumber.text=number
再次放入
changeEventDescr
function?@user3766930我已编辑了答案。请现在检查等待,我希望我能清楚地理解它-我是否应该创建一个随机字符串变量(
var text=“sth”
),然后在viewdiload()中将其分配给我的标签(
userNumber.text=text
)然后将行
userNumber.text=number
再次放入
changeEventDescr
function?@user3766930我已编辑了答案。请现在检查