I'm trying to set UILabel.text a string which is located into coredata, but I get an error which says:Instance member "test1" cannot be used on type 'ProfileViewController' did you mean to use a value of this type instead? any solutions?
override func viewWillAppear(_ animated: Bool) {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
test1 = data.value(forKey: "username") as! String
}
} catch {
print("Failed")
}
}
var test1 = String()
let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = test1 //error is here
label.font = UIFont.boldSystemFont(ofSize: 26)
label.textColor = .white
return label
}()
CodePudding user response:
You don't need to refer to test1 when you create the label. The text property of a UILabel is an optional string, so not assigning a value is perfectly legal.
Even if you could/did assign test1, it won't help you achieve what you want since UIKit doesn't work with bindings; assigning a new value to test1 in viewDidAppear won't change the value in the label.
You also need to add your nameLabel to the view controllers view and either set some constraints or set its frame; I will assume you have done this in viewDidLoad but not shown that here.
All you need is:
let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 26)
label.textColor = .white
return label
}()
override func viewWillAppear(_ animated: Bool) {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
if let result = result as? [NSManagedObject] {
for data in result {
self.nameLabel.text = data.value(forKey:"username") as? String
}
} catch {
print("Failed")
}
super.viewDidAppear(animated) // Don't forget to call super
}
If you did want to keep the name in a property, then you could implement a pseudo-binding with a didSet function:
let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 26)
label.textColor = .white
return label
}()
var name: String? {
didSet {
self.nameLabel.text = name
}
}
override func viewWillAppear(_ animated: Bool) {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
if let result = result as? [NSManagedObject] {
for data in result {
self.name = data.value(forKey:"username") as? String
}
} catch {
print("Failed")
}
super.viewDidAppear(animated) // Don't forget to call super
}
CodePudding user response:
Try this:
override func viewDidAppear() {
super.viewDidLoad()
test() // run the func here
}
func test() {
var test1 = String()
let nameLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.text = test1 //error is here
label.font = UIFont.boldSystemFont(ofSize: 26)
label.textColor = .white
return label
}()
}
