2016-03-18 56 views
0

這裏是我的BorderView和我試圖做的任務是將自定義對象(邊框)連接到主要故事板。自定義數據源方法不是在快速2.0調用

import UIKit 
protocol BorderViewDataSource: class{ 
func colorForBorderView(sender:BorderView) -> String? } 
class BorderView: UIView { 

@IBOutlet weak var topLeftImage: UIImageView! 
@IBOutlet weak var topRightImage: UIImageView! 
@IBOutlet weak var bottomLeftImage: UIImageView! 
@IBOutlet weak var bottomRightImage: UIImageView! 

var view: UIView! 

weak var dataSource:BorderViewDataSource? 


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

    xtraSetup() 
} 
    required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    xtraSetup() 
} 


func xtraSetup() { 

    view = loadViewFromNib() 

    // use bounds not frame or it'll be offset 
    view.frame = bounds 

    // Make the view stretch with containing view 
    view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] 
    // Adding custom subview on top of our view (over any custom drawing > see note below)  
    addSubview(view) 
    let borderColor = dataSource?.colorForBorderView(self) ?? "red" 
    applyColor(borderColor) 

} 

// this is an actual load from nib module 
func loadViewFromNib() -> UIView { 

    let bundle = NSBundle(forClass: self.dynamicType) 
    let nib = UINib(nibName: "BorderView", bundle: bundle) 
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 

    return view 
} 

func applyColor(borderColor:String){ 
    var imageName = "border-topleft-\(borderColor)" 
    topLeftImage.image = UIImage(named: imageName) 
    imageName = "border-topright-\(borderColor)" 

    print("Border color is \(borderColor), and Last image name is \(imageName)") 


} 
} 

因此,當我打開應用程序,它會顯示不同的顏色取決於什麼顏色的值在ViewContorller.swift設定的圖像,這裏是我的視圖 - 控制。 SWIFT代碼

class ViewController: UIViewController, BorderViewDataSource { 

var borderType = 2 
@IBOutlet weak var borderView: BorderView!{ 
    didSet{ 
     borderView.dataSource = self 
    } 
} 
override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func colorForBorderView(sender: BorderView) -> String? { 

    var borderColor = "blue" 
    switch borderType { 
     case 1: borderColor = "blue" 
     case 2: borderColor = "purple" 
     case 3: borderColor = "red" 
     default: break 
    } 
    print("Border Type is \(borderType), and border color is \(borderColor)") 
    return borderColor 
} 

}當我運行的應用程序

回答

0

似乎當視圖初始化時,該視圖的dataSource屬性是nil

colorForBorderView方法不調用。你只能在視圖的初始化過程中調用該方法。您可以viewDidLoad()後應用的顏色在您的視圖控制器

0

從文檔:

當你指定一個默認值到存儲的屬性,或初始化中設置該 初始值的該值財產直接設置爲 ,不需要任何財產觀察員。

這就是沒有設置數據源的原因。放線borderView.dataSource = selfviewDidLoad()

+0

喜先生 我檢查它,但它不工作 –

+0

委託方法是所謂的'UIView'類,這是太快的'init'方法。您必須確保在調用委託方法之前設置委託。 – vadian