Swift委托和故事板@IBDesignable问题

时间:2015-06-28 14:18:04

标签: swift

以下只是代表团的考验。

我做的是,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()
    }
  }
}

1 个答案:

答案 0 :(得分:1)

答案1:

self是代码所在类的实际实例(正确的解决方案)

ViewController()创建一个全新的ViewController实例,它与在IB中创建的实例不同(错误的解决方案)

答案2:

永远不要为IBOutlet实现didSet,因为它在初始化期间从未被调用过。最好使用viewDidLoad()进行设置

其他一些说明:

请考虑类,协议和枚举名称以大写字母开头的命名约定。

不需要协议声明中的class约束