以下只是代表团的考验。
我做的是,1)画一个矩形,2)用委托设置这个矩形的线宽,3)希望故事板可以更新它的显示。
有两个问题:
第一个是:如果我使用“testView.widthdelegate = ViewController()
”而不是“testView.widthdelegate = self
”,则“var widthValue: CGFloat? = widthdelegate?.trueWidth
”将为零,但应为50,“自我”之间有什么不同“和”ViewController()
“?
第二个是:我仍然想在故事板中更新绘制结果,在那里你可以看到我做了SetNeedDisplay()
但完全没用,我该怎么办?
查看
import UIKit
protocol widthDelegate: class {
var trueWidth: CGFloat { get }
}
@IBDesignable
class TestView: UIView {
weak var widthdelegate: widthDelegate?
override func drawRect(rect: CGRect) {
var widthValue: CGFloat? = widthdelegate?.trueWidth ?? 1.0
rectangle(widthRefer: widthValue!)
println("width in TestView is \(widthdelegate?.trueWidth)" )
}
func rectangle(#widthRefer: CGFloat) -> UIBezierPath{
var rect = UIBezierPath(rect: CGRect(x: bounds.width/2-50, y: bounds.height/2-50, width: 100, height: 100))
rect.lineWidth = widthRefer
rect.stroke()
return rect
}
}
控制器
import UIKit
class ViewController: UIViewController,widthDelegate {
var trueWidth: CGFloat = 50
@IBOutlet var testView: TestView!{
didSet{ //after the storyboard loaded.
// testView.widthdelegate = ViewController()
testView.widthdelegate = self
testView.setNeedsDisplay()
}
}
}
答案 0 :(得分:1)
答案1:
self
是代码所在类的实际实例(正确的解决方案)
ViewController()
创建一个全新的ViewController实例,它与在IB中创建的实例不同(错误的解决方案)
答案2:
永远不要为IBOutlet实现didSet
,因为它在初始化期间从未被调用过。最好使用viewDidLoad()
进行设置
其他一些说明:
请考虑类,协议和枚举名称以大写字母开头的命名约定。
不需要协议声明中的class
约束