初学者Swift - 无法将UILabel.text更改为对象中的存储属性

时间:2017-04-23 06:29:16

标签: swift function uilabel

非常基本的问题感谢您的帮助

尝试通过引用对象(jName)中的存储属性来更改UILabel的文本,这样您可以在将来更改/添加更多名称/标签,而不是仅仅显式声明firstName.text =" Joe布罗格斯"

不明白为什么它不允许我将文本更改为jName的存储属性?我尝试了属性,但这也没有帮助。有人知道构建这个的最佳方法吗?

class ViewController: UIViewController {


    @IBOutlet var firstName: UILabel!
    @IBOutlet var thirdName: UILabel!

    struct jName {

        var fName: String = "Joe"
        var lName: String = "Blogs"

        init(fName: String, lName: String) {
            self.fName = fName
            self.lName = lName
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        assignLabels()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func assignLabels() {

        firstName.text = jName.fName
        thirdName.text = jName.lName

    }
}

3 个答案:

答案 0 :(得分:0)

我正在提供一些提示代码,希望你能得到一个想法!

struct jName {

var fName: String = "Joe"
var lName: String = "Blogs"

init(fName: String, lName: String) {
    self.fName = fName
    self.lName = lName
}
}

let myname = jName.init(fName: "sanjeet", lName: "kumar")
let mystrng = myname.fName
print(mystrng)

答案 1 :(得分:0)

首先,既然你正在使用struct,那么已经有了一个内置的构造函数,所以如果你没有在其上放置自定义代码,那么代码中的这部分是不必要的:

init(fName: String, lName: String) {
    self.fName = fName
    self.lName = lName
}

它不会让您更改文本,因为您没有初始化结构并且您正在尝试直接访问其属性。您应该在使用其属性之前实例化该结构:

func assignLabels() {
    let jNameStruct = jName(fName: "Joe", lName: "Blogs")
    firstName.text = jNameStruct.fName
    thirdName.text = jNameStruct.lName

}

另一个选项是在变量中使用static修饰符,这样您就可以直接访问存储的属性:

struct jName {

    static var fName: String = "Joe"
    static var lName: String = "Blogs"

    init(fName: String, lName: String) {
        self.fName = fName
        self.lName = lName
    }
}

答案 2 :(得分:0)

由于您编写了一个结构,因此需要先创建它的新实例,然后才能访问其属性。

所以把这一行放在你的班级中:

var names = jName(fName: "Joe", lName: "Blogs")

以上行将创建jName的新实例。现在,您可以使用变量names来访问属性:

func assignLabels() {

    firstName.text = names.fName
    thirdName.text = names.lName

}

从您提出问题的方式来看,我认为您真正想要的是当names.fNamenames.lName的值发生变化时,标签的文字会自动更改。为此,您需要向属性添加属性观察器,并在属性观察器中设置标签文本:

struct jName {

    var fName: String = "Joe" {
        willSet { firstName.text = newValue }
    }
    var lName: String = "Blogs" {
        willSet { thirdName.text = newValue }
    }

    init(fName: String, lName: String) {
        self.fName = fName
        self.lName = lName
    }
}