2015-06-28 67 views
0

以下僅僅是對代表團的測試。我做的是,1)畫一個矩形,2)用代表設置這個矩形的線寬,3)希望故事板可以更新它的顯示。斯威夫特代表團和故事板@IBDesignable問題

有兩個問題:

第一是:如果我使用「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

答1:

self是類的實際實例的代碼是在(正確溶液)

ViewController()創建視圖控制器的一個全新的實例,它是不是在IB(錯誤的解決方法)創建的實例

答2相同:

決不爲一個IBOutlet實施didSet,因爲它從來沒有在初始化過程中被調用。

請考慮命名約定類,協議和枚舉名稱開頭大寫字母:用於設置

其他一些注意事項更好地利用viewDidLoad()

協議聲明中的class約束不需要

+0

嘿哥們,非常感謝:) –