为啥我不能在 Swift 中使用从一个 UIViewController 传递到另一个(在控制台中打印数据)的数据设置标签?

Posted

技术标签:

【中文标题】为啥我不能在 Swift 中使用从一个 UIViewController 传递到另一个(在控制台中打印数据)的数据设置标签?【英文标题】:Why I cannot set the labels with the data passed from one UIViewController to another (printing the data in console works) in Swift?为什么我不能在 Swift 中使用从一个 UIViewController 传递到另一个(在控制台中打印数据)的数据设置标签? 【发布时间】:2016-03-10 16:37:07 【问题描述】:

在我的应用程序中,我在容器中嵌入了 UIViewController。在我的故事板中,我向这个视图控制器添加了一个触摸事件,并调用了 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


这里有什么问题?

【问题讨论】:

你试试 alloc 并像这样初始化那个类:- var showRequestDetails:ShowRequestDetailsFromMap = ShowRequestDetailsFromMap () => 那么它可能会工作..试试吧...... 好的,我试过了,但我收到了这个错误imgur.com/zdmwPRn 在 consol 中获得该数字的日志值?你调试了吗? 我的问题是,即使我在方法changeEventDescr 中写userNumber.text = "aaaa",标签也不会更新......我不知道这里可能是什么问题 【参考方案1】:

问题是当调用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)
        
    

【讨论】:

等等,我希望我理解清楚 - 我应该创建一个随机字符串变量 (var text = "sth"),然后将它分配给我在 viewDidLoad() (userNumber.text = text) 中的标签,然后放入该行userNumber.text = number 又在 changeEventDescr 函数中? @user3766930 我已经编辑了答案。请立即查看

以上是关于为啥我不能在 Swift 中使用从一个 UIViewController 传递到另一个(在控制台中打印数据)的数据设置标签?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 Swift 中使用 let in 协议?

为啥 KVO 不能在 UIView 子类上工作?

为啥我不能在 Swift 3 中使用 JTAppleCalendar Pod 文件 JTAppleCell?

使用 Swift 从 AFNetworking 访问 JSON 数据

为啥我不能在 Swift 中调用 UIViewController 上的默认 super.init()?

为啥我不能在 Swift 的 reduce 中正确划分整数?