在调用方法时,在方法内引用调用者(UIViewController)视图

时间:2017-08-01 15:50:21

标签: ios swift uiview uiviewcontroller extension-methods

我正在扩展UIView以创建一个自定义视图,该视图将在我应用程序中的所有UIViewControllers中使用,其创建方式如下:

extension UIView {

class func customBar() -> UIView {
    let barview = UIView()
    barView.backgroundColor = .red
    barView.translatesAutoresizingMaskIntoConstraints = false
}

}

这个方法的调用者总是一个UIViewController,我想引用调用者ViewController的视图维度来为条形添加约束,这样它总是会显示在同一个位置。所以我尝试了这个:

class func customBar() -> UIView {
    let barview = UIView()
    barView.backgroundColor = .red
    barView.translatesAutoresizingMaskIntoConstraints = false

    barView.bottomAnchor.constraint(equalTo: barView.superView!.bottomAnchor, constant: -8).isActive = true
    barView.rightAnchor.constraint(equalTo: barView.superView!.rightAnchor).isActive = true
    barView.leftAnchor.constraint(equalTo: barView.superView!.leftAnchor).isActive = true
    barView.heightAnchor.constraint(equalToConstant: 44).isActive = true
}

但这会导致崩溃,因为当我调用此函数时,它还没有添加到viewController的视图中,因此,superView是nil。以下是我在viewDidLoad()

中的称呼方式
let customBar = UIView.customBar()
self.view.addSubview(customBar)

如果您有任何疑问,请告诉我而不是低估。

1 个答案:

答案 0 :(得分:0)

  

但这会导致崩溃,因为当我调用此函数时,它还没有添加到viewController的视图中,因此,superView是零。

由于约束添加代码必须在视图具有超级视图之前才能运行,因此请将其放在视图didMoveToSuperview中。