从其他类访问变量

时间:2020-03-21 20:56:57

标签: ios swift

我正在尝试从其他类访问变量。我在做什么错了?

class ViewController: UIViewController {

    var restaurantName = "Test"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnClicked(_ sender: Any) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()){
            let pop = popView()
            self.view.addSubview(pop)
        }
    }
}

这是我尝试从其访问的类:

class popView: UIView{

    fileprivate let titleLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.systemFont(ofSize:28, weight: .bold)
        label.textAlignment = .center
        //label.text = "TITLE"

        label.text = restaurantName
        return label
    }()
}

如何访问“ popView”类中的“ restaurantName”变量?

预先感谢

2 个答案:

答案 0 :(得分:3)

您不想紧密耦合视图和视图控制器。

您应该在PopView上有一个属性来保存文本。然后,您可以在创建PopView实例时为此属性分配一个值。

class PopView: UIView{

    fileprivate let titleLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.font = UIFont.systemFont(ofSize:28, weight: .bold)
        label.textAlignment = .center
        //label.text = "TITLE"

        label.text = restaurantName
        return label
    }()

    var titleText: String? {
        didSet {
            self.titleLabel.text = titleText
        }
    }
}

class ViewController: UIViewController {

    var restaurantName = "Test"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnClicked(_ sender: Any) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()){
            let pop = popView()
            pop.titleText = restaurantName
            self.view.addSubview(pop)
        }
    }
}

答案 1 :(得分:0)

由于“ popupView”类是“ ViewController”的实例,因此您无法访问“ popView”类中的“ restaurantName”变量。

如果要将属性“ restaurantName”分配给“ titleLabel”,只需从属性“ titleLabel”中删除“ fileprivate”,然后将此行添加到“ addSubview”函数之前。

pop.titleLabel.text = restaurantName

还将您的“ popView”类更改为以下

class popView: UIView{

weak var titleLabel: UILabel!

func awakeFromNib() {
    super.awakeFromNib()
    titleLabel = UILabel()
    titleLabel.translatesAutoresizingMaskIntoConstraints = false
    titleLabel.font = UIFont.systemFont(ofSize:28, weight: .bold)
    titleLabel.textAlignment = .center
}