Не удалось получить доступ к IBOutlets подкласса UIView из TabBarController

У меня есть класс 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
    }
}

Это потому, что вы установили имя класса как UIView для проводного соединения.

El Tomato 18.06.2019 06:52

так как это должно быть. Нужно ли мне установить его как UIViewController?

Saravanan 18.06.2019 06:57

Вы можете нажать ctrl на розетку в xib и проверить, есть ли у чего-то более одного соединения @Saravanan?

Mohmmad S 18.06.2019 07:07

Проверил, подключение только одно. Не могли бы вы взглянуть на код в файле Should change Delegate. есть ли ошибка, которую я сделал? @Мохаммад С

Saravanan 18.06.2019 07:14

@Saravanan Пожалуйста, установите соединение из самого UIView, щелкнув по нему правой кнопкой мыши, возможно, вы сделали это из File's Owner. Также щелкните правой кнопкой мыши File's Owner и UIView и убедитесь, что не должно быть никаких желтых предупреждений.

TheTiger 18.06.2019 12:19

Спасибо за ваши комментарии. У меня другая проблема. Я использовал неправильный способ добавления UIView, теперь он работает отлично @TheTiger

Saravanan 18.06.2019 13:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
156
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно, вы скопировали XIB и забыли удалить/добавить соединение с IBOutlet. Пожалуйста, проверьте.

Это указывает на то, что уже подключенный объект Interface Builder удален/переименован в источнике его владельца (File's Owner).

Я проверил и переподключил все свои розетки. если я запускаю проект без добавления выхода, он работает. Но когда я добавляю выход, он разбился

Saravanan 18.06.2019 06:55

попробуйте проверить все сообщения оттуда: stackoverflow.com/questions/3088059/…. На первый взгляд действительно кажется, что это плохое соединение, переименование или проблема с владельцем файла.

Olympiloutre 18.06.2019 07:11

Возможно, вы забыли удалить соединение с IBOutlet. Пожалуйста, установите флажок «Показать инспектор соединений». Сначала щелкните инспектор файлов xib, затем нажмите «Показать инспектор соединений». Показано на изображении.

Удалите сломанные розетки.

Проверил, с розетками проблем нет. Я думаю, что проблема в методе делегата. self.view.addsubview() может вызвать эту проблему. Пожалуйста, посмотрите на этого делегата?

Saravanan 18.06.2019 07:27

@Saravanan Удалите «private» из приватной функции commitInit() . это может быть причиной проблемы

Mantu 18.06.2019 07:37

теперь, наконец, вы можете снова создать выходы для кнопок

Mantu 18.06.2019 08:26
Ответ принят как подходящий

Наконец я нашел проблему. Это правильный способ добавить 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
    }
}

Другие вопросы по теме