我花了好几天试图解决这个问题,但找不到任何解决方案(programmaticaly除外):

我有2个UIViewController,其中第二个是UIChildViewController . 在ChildViewController中,我有一个IBOutlet UIView类的属性链接到故事板中的CustomClassUIview . 此CustomClassUIview具有方法和属性来更新此类中的形状图层定义 .

问题是当我尝试访问此自定义uiview的一个属性时,它返回nil . 我知道IBOutlet是在viewDidLoad,viewWillAppear,...之外触发的,但我不知道如何保留alloc .

我使用故事板更容易设计,但如果我这样做只有programmaticaly它的工作原理 .

请帮忙 .

class ChildViewController: UIViewController {

@IBOutlet weak var customUIView: CustomClassUIView!

var upperValueProgress:CGFloat = 0 {
    didSet {
        self.customUIView.progress = upperValueProgress
        updateLayerFrames()
    }
} 

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.greenColor()  
}

override func viewWillAppear(animated: Bool) {
    customUIView.progress = 0
}

func updateLayerFrames() {
    customUIView.reveal()
}

}

class FirstViewController: UIViewController {

var customUIViewController:ChildViewController!

override func viewDidLoad() {
    super.viewDidLoad()

    self.customUIViewController = ChildViewController()
}
...

func update(){
    self.customUIViewController.upperValueProgress = 56 // Example
}

;

@IBDesignable class CustomClassUIview: UIView {

let pathLayer = CAShapeLayer()
var circleRadius: CGFloat {
    get {
        return self.frame.width / 2
    }
    set {

    }
}

@IBInspectable var progress: CGFloat = 0 {
    didSet {
        reveal()
    }
}

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

}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    configure()
    reveal()

}



func configure() {
    pathLayer.frame = self.bounds
    pathLayer.lineWidth = 2
    pathLayer.backgroundColor = UIColor.clearColor().CGColor
    pathLayer.fillColor = UIColor.clearColor().CGColor
    pathLayer.strokeColor = UIColor.redColor().CGColor
    layer.addSublayer(segmentTimerPathLayer)
    backgroundColor = UIColor.whiteColor()
    progress = 0
}


func circleFrame() -> CGRect {
    var circleFrame = CGRect(x: self.bounds.minX, y: self.bounds.minY, width: 2*circleRadius, height: 2*circleRadius)

    circleFrame.origin.x = 0  
    circleFrame.origin.y = 0 
    return circleFrame
}

func circlePath() -> UIBezierPath {        
    return UIBezierPath(ovalInRect: circleFrame())
}

override func layoutSubviews() {
    super.layoutSubviews()
    pathLayer.frame = bounds
    pathLayer.path = circlePath().CGPath
}

func reveal() {
    println(progress)    
}

}