2016-03-18 20 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