У меня есть класс UIView с xib. Я пытаюсь добавить его в другой ViewController как всплывающее окно. У меня есть розетки. Но когда я запускаю приложение, оно вылетает и сообщает
This class is not key value coding-compliant for the key btnAbtUs
Я думаю, проблема в том, что нужно выбрать делегата. Я могу использовать неправильный способ добавления этого xib. Как я могу это исправить?
Вот мой код.
мой UIView подкласс
class MoreView: UIView {
@IBOutlet var containerView: UIView!
@IBOutlet weak var btnAboutUs: UIButton!
override public func awakeFromNib() {
super.awakeFromNib()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadViewFromNib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadViewFromNib()
}
func loadViewFromNib() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "MoreView", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.insertSubview(view, at: 0)
commitInit()
}
private func commitInit(){
containerView.translatesAutoresizingMaskIntoConstraints = true
self.btnAboutUs.addTarget(self, action: #selector(self.clickAboutUs(_:)), for: .touchUpInside)
}
class func instanceFromNib() -> UIView {
return UINib(nibName: "MoreView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}
@objc func clickAboutUs(_ sender: Any) {
print("tap")
}
}
в UITabBarController
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
let moreView = MoreView.instanceFromNib
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { $0 is MoreViewController }) {
moreView().frame.origin.y = 100
self.view.addSubview(moreView())
return false
} else {
moreView().removeFromSuperview()
return true
}
}
так как это должно быть. Нужно ли мне установить его как UIViewController?
Вы можете нажать ctrl на розетку в xib и проверить, есть ли у чего-то более одного соединения @Saravanan?
Проверил, подключение только одно. Не могли бы вы взглянуть на код в файле Should change Delegate. есть ли ошибка, которую я сделал? @Мохаммад С
@Saravanan Пожалуйста, установите соединение из самого UIView, щелкнув по нему правой кнопкой мыши, возможно, вы сделали это из File's Owner. Также щелкните правой кнопкой мыши File's Owner и UIView и убедитесь, что не должно быть никаких желтых предупреждений.
Спасибо за ваши комментарии. У меня другая проблема. Я использовал неправильный способ добавления UIView, теперь он работает отлично @TheTiger





Возможно, вы скопировали XIB и забыли удалить/добавить соединение с IBOutlet. Пожалуйста, проверьте.
Это указывает на то, что уже подключенный объект Interface Builder удален/переименован в источнике его владельца (File's Owner).
Я проверил и переподключил все свои розетки. если я запускаю проект без добавления выхода, он работает. Но когда я добавляю выход, он разбился
попробуйте проверить все сообщения оттуда: stackoverflow.com/questions/3088059/…. На первый взгляд действительно кажется, что это плохое соединение, переименование или проблема с владельцем файла.
Возможно, вы забыли удалить соединение с IBOutlet. Пожалуйста, установите флажок «Показать инспектор соединений». Сначала щелкните инспектор файлов xib, затем нажмите «Показать инспектор соединений». Показано на изображении.
Удалите сломанные розетки.
Проверил, с розетками проблем нет. Я думаю, что проблема в методе делегата. self.view.addsubview() может вызвать эту проблему. Пожалуйста, посмотрите на этого делегата?
@Saravanan Удалите «private» из приватной функции commitInit() . это может быть причиной проблемы
теперь, наконец, вы можете снова создать выходы для кнопок
Наконец я нашел проблему. Это правильный способ добавить UIView в качестве контроллера SubView для UIViewController.
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let navigationController = viewController as? UINavigationController,
navigationController.viewControllers.contains(where: { $0 is MoreViewController }) {
let mySubView : MoreView
mySubView = MoreView(frame: CGRect(x: 0, y: 0, width: 375, height: 667) )
self.view.addSubview(mySubView)
return false
} else {
return true
}
}
Это потому, что вы установили имя класса как UIView для проводного соединения.