【问题标题】:Swift 3 - Access Variable From Instance Of XIB In Another ClassSwift 3 - 从另一个类中的 XIB 实例访问变量
【发布时间】:2017-09-29 14:14:42
【问题描述】:

这几天我一直在尝试解决这个问题,但运气不佳:(

我想要做的是在另一个 ViewController 中已经存在的 XIB 实例(称为 BottomNav)中设置变量,称为“curX”。我最接近以下内容:

class Util: NSObject {
    class func loadNib() {
        let nib: BottomNav = Bundle.main.loadNibNamed("BottomNav", owner: self, options: nil)!.first as! BottomNav
        nib.curX = 10
    }
}

这是 BottomNav 类:

class BottomNav: UIView {
    @IBOutlet var view: UIView!
    @IBOutlet weak var homeBtn: UIView!
    @IBOutlet weak var scroller: UIScrollView!
    @IBOutlet weak var scrollerContent: UIView!

    var curX = 32

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!

        Bundle.main.loadNibNamed("BottomNav", owner: self, options: nil)
        self.addSubview(self.view)
    }

}

这会在没有警告的情况下通过编译器,但是当它运行时,我会收到“此类与键的键值编码不兼容”错误。当有一个不再存在的插座时,通常会出现这种情况,但绝对不是这种情况,我已经使用应用程序上已经存在的多个 XIB 对其进行了测试,并且首先通过情节提要加载没有问题。我只收到“loadNibNamed”这个错误。

我在这里走对了吗?我的想法是我的 Util 类可能无法访问 Bundle 或其他东西?

【问题讨论】:

  • 尝试检查该 xib 中已连接的 iboutlet 并从该 xib 中删除未连接的连接。
  • 正如我所提到的,这绝对是,100% 不是问题。它已经过检查,双重检查,在多个 XIB 上尝试过。它甚至在通过情节提要完成时第一次加载而没有问题。
  • 您能在此处添加您的 BottomNav 类吗?
  • 刚刚添加。

标签: ios swift xib


【解决方案1】:
class BottomNav: UIView {
    @IBOutlet var view: UIView!
    @IBOutlet weak var homeBtn: UIView!
    @IBOutlet weak var scroller: UIScrollView!
    @IBOutlet weak var scrollerContent: UIView!

    var curX = 32

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    func commonInit(){

        Bundle.main.loadNibNamed("BottomNav", owner: self, options: nil)
        guard let content = view else { return }
        content.frame = self.bounds
        content.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        self.addSubview(content)
    }

}

在调用实例时,请尝试以下操作。

        let instance = BottomNav()
        instance.curX = 30

【讨论】:

  • 啊,是的,这确实有效,但是让 instance=BottomNav() 创建一个新实例是吗?我需要访问一个已经存在的实例,这可能吗?
  • 我想我可以用新实例替换旧实例,应该这样做吗?
  • 太棒了,非常感谢!这让我意识到我的知识差距,我有点知道,但它还没有点击......当涉及到视图和视图控制器的生命周期时。
【解决方案2】:

Swift 3.0

我认为您可以从中获得解决方案。万事如意

    var view: UIView!

    override init(frame: CGRect) {

        // call super.init(frame:)
        super.init(frame: frame)

        // 3. Setup view from .xib file
        xibSetup()
    }

    required init?(coder aDecoder: NSCoder) {

        // call super.init(coder:)
        super.init(coder: aDecoder)

        // 3. Setup view from .xib file
        xibSetup()
    }

    // MARK: - UI setup
    func xibSetup() {

        let nib = UINib(nibName: "BottomNav", bundle: nil)
        view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

        // use bounds not frame or it'll be offset
        view.frame = bounds

        // Make the view stretch with containing view
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]

        addSubview(view)
    }

【讨论】:

  • 我试过了,它给了我一个“调用中的额外参数'捆绑'”编译器错误。
  • 我检查了你的 BottomNav 类,所以请尝试上面的编辑代码。这对我有帮助,我认为它也对你有用。万事如意
  • 这是一个我还没有遇到过的解决方案,但是在这种情况下如何访问变量 curX?
猜你喜欢
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2011-04-28
  • 2020-04-14
  • 2012-01-23
相关资源
最近更新 更多