【问题标题】:custom datasource method is not calling in swift 2.0自定义数据源方法未在 swift 2.0 中调用
【发布时间】:2016-03-18 11:37:53
【问题描述】:

这是我的 BorderView,我要做的任务是将自定义对象(边框)连接到主情节提要。

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 中设置的颜色值显示不同颜色的图像,这是我的视图控制器。快速代码

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 方法在我运行应用程序时没有调用

【问题讨论】:

    标签: swift2 xcode7


    【解决方案1】:

    似乎在初始化视图时,该视图的dataSource 属性是nil。而且您仅在视图初始化期间调用该方法。您可以在视图控制器中应用 viewDidLoad() 之后的颜色

    【讨论】:

      【解决方案2】:

      来自文档:

      当你给一个存储的属性分配一个默认值,或者设置它的 初始化器中的初始值,该属性的值被设置 直接,无需调用任何属性观察者。

      这就是未设置数据源的原因。将行borderView.dataSource = self 放入viewDidLoad()

      【讨论】:

      • 委托方法在UIView类的init方法中被调用,太快了。您必须确保在调用委托方法之前设置委托。
      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2015-12-28
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 2021-12-28
      相关资源
      最近更新 更多