Я не мог заставить это выполнить копирование / вставку кода.Может быть, не хватает какой-то настройки, но мне трудно понять, как она должна работать.Исходный код в вопросе вылетает в этой строке:
contentView.addSubview(self)
, потому что если у вас есть IBOutlets
, они всегда будут nil
, если вы инициализируете его с помощью MyCustomView(frame: self.view.frame)
.Он должен вызывать функцию initWithCoder
.
Здесь много чего происходит, но вот как я бы это сделал:
class MyCustomViewController: UIViewController {
var myView: MyCustomView!
override func viewDidLoad() {
super.viewDidLoad()
myView = Bundle.main.loadNibNamed("MyCustomView", owner: self, options: nil)?.first as? MyCustomView
self.view.addSubview(myView)
updateScrollViewSize()
print("myView Frame: \(myView.frame)")
print("myView ContentSize: \(myView.contentView.contentSize)")
}
func updateScrollViewSize () {
var contentRect = CGRect.zero
for view in myView.contentView.subviews {
contentRect = contentRect.union(view.frame)
}
myView.contentView.contentSize = CGSize(width: myView.contentView.frame.size.width, height: contentRect.size.height + 5)
}
}
class MyCustomView: UIView {
let kCONTENT_XIB_NAME = "MyCustomView"
@IBOutlet var contentView: UIScrollView!
@IBOutlet weak var lbl_datein: UILabel!
//.. A bunch of other GUI elements for the scrollview
@IBOutlet weak var text_location: UITextField!
}
Я предполагаю, что верхний уровеньобъект в кончике имеет класс MyCustomView
, что приведет к множеству странных вещей.loadNibNamed
вызовет init?(coder aDecoder: NSCoder)
, так что в идеале вы бы просто вызывали его из контроллера вида, а не из объекта пользовательского представления.
Что касается "не могу добавить"Ошибка "self as subview", я не видел эту ошибку во время работы, но я ожидал бы ее от этой строки:
contentView.addSubview(self)
, поскольку это именно то, что онадобавляет self
как подпредставление представления, которое уже является подпредставлением self
.