2017-04-23 27 views
1

非常基本的問題,感謝您的幫助初學者斯威夫特 - 無法更改UILabel.text存儲財產對象

試圖通過查閱存儲財產對象(jName)來改變一個UILabel的文本,這樣你就可以改變未來/添加更多的名稱/標籤,而不是隻是明確地聲明firstName.text =「Joe Bloggs」

不明白爲什麼它不會讓我改變文本到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 

    } 
} 

回答

0

首先,因爲你使用的結構,已經有一個內置的構造函數,因此這部分在你的代碼是不必要的,如果你不puting上有一個自定義代碼:

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