在init之前设置CustomView委托

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在init之前设置CustomView委托相关的知识,希望对你有一定的参考价值。

虽然我可以在我的CustomView类中创建一个func setImages ()并在初始化myCustomView之后调用它,但我想了解是否有更简洁的方法来设置视图的委托,以便在初始化时可以访问它。

我的主ViewController包含

class Main: UIViewController, CustomViewDelegate {

    var imagesArray:[UIImage] = [Image1,Image2,Image3,Image4,Image5]

    var myCustomView = CustomView()

    override func viewDidLoad() {
        super.viewDidLoad()

        myCustomView.delegate = self
        myCustomView = CustomView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
        //this causes init of CustomView, but delegate is now nil and button images don't load
    }
}

我的CustomView文件包含

var buttonsArray = [Button1,Button2,Button3,Button4,Button5]

override init(frame: CGRect) {
    super.init(frame : frame)       

    for n in 0..< buttonsArray.count {
        buttonsArray[n].setImage(delegate?.imagesArray[n], for: .normal)
    }
}
答案

您可以创建一个新的初始化程序,它采用框架和委托类型,并在将图像设置为按钮之前设置委托

 init(frame: CGRect,sender: CustomViewDelegate) {
    super.init(frame : frame)

    self.delegate = sender

    for n in 0..< buttonsArray.count {
       buttonsArray[n].setImage(delegate?.imagesArray[n], for: .normal)
    }
}

为此,你必须确认你的viewController为委托(显然)。在viewController中调用你的customView如下:

class ViewController: UIViewController, CustomViewDelegate {

    var myCustomView: CustomView!        

    override func viewDidLoad() {

       myCustomView = CustomView(frame: self.view.bounds, sender: self)
    }
}

希望能帮助到你!

以上是关于在init之前设置CustomView委托的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationItem barButtonItem customView 检测其他项目然后设置宽度

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

Swift - UIBarButtonItem.customView - 重置为原始状态

CustomView with squiggle(wavy)top。(Swift)

带有customView的自动布局iOS 11工具栏UIBarButtonItem

在返回值之前等待委托执行