将 Label 设置为 CoreData 中的字符串

set Label a String which is in CoreData

我正在尝试设置 UILabel.text 一个位于 coredata 中的字符串,但我收到一条错误消息:Instance member "test1" cannot be used on type 'ProfileViewController' did you mean to use a value of this type instead? 有什么解决方案吗?

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

试试这个:

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

创建标签时不需要参考test1UILabeltext 属性 是一个可选字符串,所以不赋值是完全合法的。

即使您 could/did 分配 test1,它也不会帮助您实现您想要的,因为 UIKit 不适用于绑定;在 viewDidAppear 中为 test1 分配新值不会更改标签中的值。

您还需要将 nameLabel 添加到视图控制器 view 并设置一些约束或设置其 frame;我假设您已在 viewDidLoad 中完成此操作,但未在此处显示。

您只需要:

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
}

如果您确实想将名称保留在 属性 中,那么您可以使用 didSet 函数实现伪绑定:


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
}