gpt4 book ai didi

swift - 无法以编程方式实例化 View

转载 作者:行者123 更新时间:2023-11-30 10:30:17 25 4
gpt4 key购买 nike

我创建了一个组件(swift + xib 文件)


@IBDesignable
class MainItem: UIView {
let kCONTENT_XIB_NAME = "MainItem";

@IBOutlet weak var newsImage: UIImageView!;
@IBOutlet weak var newsTitle: UILabel!;

@IBInspectable var image:UIImage? {
didSet {
if(image != nil && newsImage != nil) {
newsImage.image = image;
}
}
};

@IBInspectable var title:String = "" {
didSet {
newsTitle.text = title;
}
};

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}

override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}


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

func loadViewFromNib() -> UIView? {
let nib = UINib(nibName: kCONTENT_XIB_NAME, bundle: nil)
return nib.instantiate(withOwner: self, options: nil).first as? UIView
}

func commonInit() {
// standard initialization logic
guard let view = loadViewFromNib() else { return }
view.frame = self.bounds
self.addSubview(view)

if(newsImage != nil) {
let bounds = CGRect.init(x: newsImage.frame.origin.x,
y: newsImage.frame.origin.y + (newsImage.frame.height / 2),
width: newsImage.frame.width,
height: newsImage.frame.height / 2)

newsImage.addBlackGradientLayerInBackground(frame: bounds, colors:[.clear, .black])
}
}
}

我在一个教程中完成了 xib,我已将文件所有者连接到类,并且 IBOutlet 也已连接。如果我在 Storyboard中使用这个组件,那么效果很好。

现在我尝试在我的代码中使用它

func initSlider() -> [MainItem] {

let slide1 = UINib(nibName: "MainItem", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! MainItem

slide1.image = UIImage(named: "u17119.png")
slide1.title = "bla bla"

return [slide1];
}

我在启动时收到此错误

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key newsImage.'

我不确定为什么会这样

还有一个旁注:

如果我取消组件中 viewDidLoad 部分的注释 - 我无法编译

Method does not override any method from its superclass Value of type 'UIView' has no member 'viewDidLoad'

最佳答案

了解第一个(工作)示例中的代码是如何工作的,这对您很有用。故事中有两个 View :代码中声明的 MainItem 和 MainItem.xib 文件中设计的 UIView。它们不同!代码中声明的是MainItem。 .xib 中的只是一个普通的 UIView。

.xib 文件中,文件的所有者被声明为 MainItem。因此,文件所有者会生成 newsImagenewsTitle 导出,并且这些导出会挂接到 .xib 文件中 UIView 的 subview 。

当 MainItem 初始化时,它会进入 .xib 文件并加载 UIView 及其自身(MainItem)作为所有者。这与 socket 的情况相匹配,因此 socket 已正确连接。然后它将 UIView 作为自己的 subview 放入其自身中,大小完全相同。因此它充当 UIView 的宿主。

让我们绘制该架构的图表:

MainItem view --> subview --> xib file UIView
newsImage outlet --------> UIImageView subview
newsTitle outlet --------> UILabel subview

重点是,这是此 xib 文件能够正确运行的唯一架构。​​

因此,在第二个示例中,您尝试使用完全不同的架构。您不再位于 MainItem 中;你在 UIViewController 中。并且您尝试自己直接进入 xib 并以 nil 作为所有者加载 UIView,并且没有 MainItem 来托管它。您完全绕过了 MainItem 及其建立的加载架构!因此 socket 无法连接并且你会崩溃。

关于swift - 无法以编程方式实例化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59310249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com