为什么不能将'UIView'类型的值强制转换为其他View?

时间:2018-10-21 12:35:12

标签: swift uiview casting

此问题与我上一个问题的处理代码相同。
(上一个问题是Why is this View nil in awakeFromNib()?
但是完全不同的方法。
这不是重复的问题。
因此,让我重组我的问题。

首先,让我总结一下我的项目。

由于先前的回答,我现在可以重用xib。 这是CardContentView.xib

enter image description here

代码在下面

@IBDesignable class CardContentView: UIView {

    @IBOutlet weak var backgroundView: UIView!

    @IBInspectable var nibName:String?
    var contentView: UIView?


    override func awakeFromNib() {
        super.awakeFromNib()
        xibSetup()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        xibSetup()
        contentView?.prepareForInterfaceBuilder()
    }


    func xibSetup(){
        guard let view = loadViewFromNib() else { return }
        view.frame = self.bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }


    func loadViewFromNib() -> UIView? {
        guard let nibName = nibName else { return nil }
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
}

这是CardView.xib,该属性遵循“类CardContentView”

enter image description here

代码在下面

class CardView: UIView {

    @IBOutlet weak var cardContentView: CardContentView!

    override func awakeFromNib() {
        cardContentView.layer.cornerRadius = 16
    }
}

这是Main.storyboard。与单个UIView。 enter image description here

代码在下面

class ViewController: UIViewController {

    @IBOutlet weak var cardView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

但是,我想在ViewController中将类'CardView'重用为'cardView'属性。
我想将'background'属性更改为'cardView'属性(简单来说,我想将CardContentView中的黄色框更改为蓝色框!)。
我想使'cardView'属性具有过渡效果。
但是,我无法进行扩展,因为它不在UIView类中,而在ViewController类中。
因此,我需要制作另一个UIView类。
这就是为什么我单独制作CardView类。
(当然,我想通过制作另一个文件来整齐地组织代码。)

因此,我尝试了两种不同的方法。

  1. 将属性“ cardView”类设置为CardView,并将其连接到ViewController。

    class ViewController: UIViewController {
    
        @IBOutlet weak var cardView: CardView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    
  2. 将'CardView'类投射到ViewController中的其他属性

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let tappedView = self.cardView as! CardView
        self.view.addSubview(tappedView)    
    }
    

但是他们两个都会出错。
1.当我使“ @IBOutlet弱var cardView:CardView!”时,它引发错误消息,“在展开可选值cardContentView = nil时意外地找到nil”。
2.当我制作'tappedView = self.cardView为!

如何解决此问题?
请帮帮我!

1 个答案:

答案 0 :(得分:-1)

  • 在CardView类的awakeFromNib()中,您没有调用super.awakeFromNib()
  • 您必须使用与从相应的XIB加载 CardContentView 时使用的逻辑(xibSetup())相同的逻辑({{1}})从相应的XIB加载 CardView 它的XIB。
  • 在情节提要的ViewController中,您是否已将 UIView 的类分配给 CardView