【问题标题】:Unable to access UIView subclass IBOutlets From TabBarController无法从 TabBarController 访问 UIView 子类 IBOutlets
【发布时间】:2019-10-31 16:09:45
【问题描述】:

我有一个带有 xib 的 UIView 类。我尝试将它作为弹出视图添加到另一个 ViewControllers 中。我有插座连接。但是当我运行应用程序时它崩溃并声明

这个类不符合键 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。
  • 那应该如何。我需要将其设置为 UIViewController 吗?
  • 你可以 ctrl 单击 xib 中的插座,并检查是否有多个连接@Saravanan ?
  • 已检查,它只有一个连接。能否请您看一下应该更改委托中的代码。我犯了什么错误吗? @Mohammad S
  • @Saravanan 请通过右键单击从UIView 本身建立连接,您可能会从File's Owner 进行连接。同样右键单击File's OwnerUIView 并检查不应该有任何黄色警告。

标签: swift swift4 addsubview


【解决方案1】:

我终于找到了问题所在。这是将 UIView 添加为 UIViewController 的 SubView 控制器的正确方法。

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
    }
}

【讨论】:

    【解决方案2】:

    您可能复制了 XIB 并忘记删除/添加与 IBOutlet 的连接。请检查。

    它表示已经连接的 Interface Builder 对象在其所有者的源(文件的所有者)中被删除/重命名。

    【讨论】:

    • 我已经检查并重新连接了我所有的插座。如果我在没有添加插座的情况下运行项目,它的工作原理。但是当我添加插座时它崩溃了
    • 尝试从那里检查所有帖子:stackoverflow.com/questions/3088059/…。乍一看,这确实是连接错误、重命名或文件所有者问题
    【解决方案3】:

    您可能忘记删除与 IBOutlet 的连接。请检查显示连接检查器。首先单击 xib 的文件检查器,然后单击显示连接检查器。如图所示。

    移除损坏的插座。

    【讨论】:

    • 我已经检查过网点没有问题。我认为问题出在委托方法上。 self.view.addsubview() 可能会导致此问题。请你看看这个代表好吗?
    • @Saravanan 从私有函数 commitInit() 中删除“私有”。这可能是导致问题的原因
    • 现在您终于可以再次创建按钮插座
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多