【发布时间】:2020-02-07 13:24:05
【问题描述】:
假设我有SomeViewController: UIViewController,我有一个自定义视图CustomView: UIView,定义为XIB,我想显示它。这个自定义视图将在其他视图控制器中重复使用,甚至在同一个视图控制器中重复使用多次。
class CustomView: UIView {
@IBOutlet public var label: UILabel!
}
我一直添加这个视图的方式是:
class UIExamples: UIViewController {
@IBOutlet private var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Assume makeViewFromNib returns the view [0] in the Nib.
let customView = makeViewFromNib(nib: "\(CustomView.self)", owner: self) as! CustomView
customView.frame = myView.bounds
myView.addSubview(customView)
}
}
假设稍后我想通过公共属性label 修改有关CustomView 的内容。
我可以在viewDidLoad 中进行操作,只是因为我可以访问customView,但是如果我想在其他一些函数中更改它怎么办?我所看到的是一个人必须做的事情
let customView = myView.subviews[0] as! CustomView
customView.label.text = "some text"
这看起来不对。
所以,我认为正确的方法应该是:
class UIExamples: UIViewController {
@IBOutlet public var customView: CustomView! // Now this is always a CustomView type
override func viewDidLoad() {
super.viewDidLoad()
// Assume makeViewFromNib returns the view [0] in the Nib.
customView = makeViewFromNib(nib: "\(CustomView.self)", owner: self) as! CustomView
customView.label.text = "some text" // DOES NOT WORK!
}
}
最后一行 customView.label.text 不起作用。事实上,标签甚至在屏幕上都看不到。我究竟做错了什么?
【问题讨论】:
-
你不需要显式调用
makeViewFromNib(nib: "\(CustomView.self)", owner: self),因为如果你在这种情况下使用IBOutlet,你已经从Storyboard加载了customView。下一点你应该澄清——你使用的是 Storyboard 还是 Xib。 -
您想在不同的视图控制器中重用视图还是专门针对那个控制器?
-
在第一句中添加了说明。
-
也许看看这里:medium.com/@letatas/…你可能会找到问题的答案
标签: ios swift uiview uiviewcontroller