swift - 为什么不能将“UIView”类型的值转换为其他视图?
问题描述
这个问题与我之前的问题处理相同的代码。
(上一个问题是Why is this View nil in awakeFromNib()?)
但完全不同的方法。
这不是重复的问题。
所以让我重新构造我的问题。
首先,让我总结一下我的项目。
感谢先前的回答,我现在可以重用 xib。这是 CardContentView.xib
代码如下
@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,属性遵循 'class CardContentView'
代码如下
class CardView: UIView {
@IBOutlet weak var cardContentView: CardContentView!
override func awakeFromNib() {
cardContentView.layer.cornerRadius = 16
}
}
这是 Main.storyboard。使用单个 UIView。
代码如下
class ViewController: UIViewController {
@IBOutlet weak var cardView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
但是,我想在 ViewController 中重用类 'CardView' 到 'cardView' 属性。
我想将 'background' 属性设置为 'cardView' 属性(简单来说,我想将 CardContentView 中的黄色框更改为蓝色框!)。
我想制作带有过渡效果的“cardView”属性。
但是,我无法进行扩展,因为它不在 UIView 类中,而是在 ViewController 类中。
所以我需要制作另一个 UIView 类。
这就是我单独制作 CardView 类的原因。
(当然,我想通过制作另一个文件来整齐地组织代码。)
所以,我尝试了两种不同的方法。
将属性“cardView”类设置为 CardView,并将其连接到 ViewController。
class ViewController: UIViewController { @IBOutlet weak var cardView: CardView! override func viewDidLoad() { super.viewDidLoad() } }
将“CardView”类转换为 ViewController 中的其他属性
override func viewDidLoad() { super.viewDidLoad() let tappedView = self.cardView as! CardView self.view.addSubview(tappedView) }
但他们都犯了错误。
1. 当我制作'@IBOutlet weak var cardView: CardView!'时,它会抛出错误消息,'Unexpectedly found nil while unwrapping an Optional value, cardContentView = nil'。
2.当我让'let tappedView = self.cardView as!CardView',它会抛出错误消息,'无法将'UIView'(0x10a229ff8)类型的值转换为'AwakeFromNibTutorial.CardView'(0x1060aa8d0)。
我怎么解决这个问题?
请帮我!
解决方案
- 在 CardView 类中
awakeFromNib()
,您没有调用super.awakeFromNib()
. - 您必须使用与从其对应的 XIB 加载CardContentView
xibSetup()
相同的逻辑 ( ),以便也从其 XIB加载CardView 。 - 在情节提要的 ViewController 中,您是否已将UIView的类分配给CardView?
推荐阅读
- javascript - nextjs strapi - 表单数据发布请求导致 500 错误
- .net-core - WSO2 v5.9.0 SAMLS SSO 与服务提供商 (AD) '用户必须在下次登录时更改密码' 导致身份验证错误而不是重定向到 .NET 应用程序
- google-oauth - 如何从 ASP.NET Core Web API 中的谷歌外部提供者获取标识值
- azure - 在 GitHub 存储库上同步 python 代码并在 Azure 函数上部署
- firefox - 新标签页上的greasemonkey开始刷新功能
- php - 如何让 PHP getter/setter 从他们的领域继承 DocBlock?
- vue.js - vue中可以不显示源代码吗?
- makefile - 如何检查是否设置了在外部文件中定义的目标中使用的变量
- git - Windows 终端 - 通过 oh-my-posh/posh-git 设置主题错误的 PowerShell 自定义?
- python - Python Selenium 无头线程