swift 无法激活NSLayoutConstraint

osh3o9ms  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(124)

我正在尝试通过NSLayoutConstraint为ViewController设置UI。下面是我使用的代码:

class ProfileViewController: UIViewController {

    private var profileUser = katyPerry
    
    private var profileImage: UIImageView {
        let imageView = UIImageView(image: UIImage(named: profileUser.login))
        imageView.translatesAutoresizingMaskIntoConstraints = false
        return imageView
    }

    override func viewDidLoad() {
        //profileUser = users.randomElement() ?? User(login: "default", name: "default")
        super.viewDidLoad()
        setUpView()
    }
    
    func setUpView() {
        view.addSubview(profileImage)
        NSLayoutConstraint.activate([
            profileImage.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            profileImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
            profileImage.heightAnchor.constraint(equalToConstant: 100),
            profileImage.widthAnchor.constraint(equalToConstant: 100)
        ])
    }
}

当运行应用程序时,它会在访问视图时抛出Error。Xcode highlight .activate并给出以下描述:***线程1:EXC_BAD_ACCESS(代码=1,地址=0x10)***。
如何解决这个问题?

j8yoct9x

j8yoct9x1#

问题是,每次你说profileImage时,你都在创建一个新的图像视图。因此,您在一小段代码中谈论了五种不同的图像视图:

view.addSubview(profileImage) // image view 1
NSLayoutConstraint.activate([
    profileImage.leadingAnchor..., // image view 2
    profileImage.topAnchor..., // image view 3
// ... and so on

要解决问题,改变

private var profileImage: UIImageView {
    let imageView = UIImageView(image: UIImage(named: profileUser.login))
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}

private lazy var profileImage: UIImageView = {
    let imageView = UIImageView(image: UIImage(named: profileUser.login))
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

相关问题