Невозможно получить доступ к подклассу UIView IBOutlets из TabBarController - PullRequest
0 голосов
/ 18 июня 2019

У меня есть класс UIView с xib. Я пытаюсь добавить его в другой ViewControllers как представление popover. У меня есть розетки. Но когда я запустил приложение, оно вылетело и показало

Этот класс не соответствует кодировке значения ключа для ключа 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
    }
}

Ответы [ 3 ]

1 голос
/ 18 июня 2019

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

Надеюсь, это поможет вам

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

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

0 голосов
/ 18 июня 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...