Swift2 自定义数据源方法未在swift 2.0中调用
这是我的BorderView,我要做的任务是将自定义对象(边框)连接到主情节提要Swift2 自定义数据源方法未在swift 2.0中调用,swift2,xcode7,Swift2,Xcode7,这是我的BorderView,我要做的任务是将自定义对象(边框)连接到主情节提要 import UIKit protocol BorderViewDataSource: class{ func colorForBorderView(sender:BorderView) -> String? } class BorderView: UIView { @IBOutlet weak var topLeftImage: UIImageView! @IBOutlet weak var topRig
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中设置的颜色值,这是我的viewcontroller。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
}
}
但是当我运行应用程序时,colorForBorderView方法没有调用当视图初始化时,该视图的
dataSource
属性似乎是nil
。并且只在视图初始化期间调用该方法。您可以在视图控制器中的viewDidLoad()
后应用颜色,请参见文档:
为存储的属性指定默认值或设置其
初始值在初始值设定项中,设置该属性的值
直接,无需致电任何财产观察员
这就是为什么没有设置数据源的原因。将行
borderView.dataSource=self
放入viewDidLoad()
在UIView
类的init
方法中调用委托方法太早了。在调用委托方法之前,必须确保已设置委托。