Swift 3 - 从另一个类的XIB实例中访问变量
Swift 3 - 从另一个类的XIB实例中访问变量
我已经试了几天了,但运气不太好:(
我想要做的是在另一个名为“curX”的ViewController中已经存在的一个XIB实例(称为BottomNav)中设置变量。我尝试了以下方法:
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,并且在storyboards中加载时没有任何问题。只有在“loadNibNamed”时才会出现这个错误。
我是否在正确的道路上?我的想法是也许我的Util类没有访问Bundle之类的权限?
在这个问题中,出现的原因是无法从一个类的实例中访问XIB文件中的变量。解决方法是在初始化方法中通过加载XIB文件,并使用instantiate方法获取XIB文件中的视图,然后将其作为子视图添加到当前视图中。
具体的解决方法如下所示:
1. 在初始化方法中调用xibSetup方法。
2. 在xibSetup方法中,使用UINib加载XIB文件,并通过instantiate方法获取XIB文件中的视图。
3. 将获取到的视图设置为当前视图的子视图,并设置其frame和autoresizingMask属性。
但是,在这个解决方法中,无法直接访问XIB文件中的变量curX。如果需要访问这个变量,可以考虑以下解决方案:
1. 在XIB文件中,将curX变量设置为一个IBOutlet属性,并连接到对应的视图。
2. 在需要访问curX变量的地方,可以通过访问当前视图的subviews属性,找到对应的视图,并获取其curX属性值。
在Swift 3中,要从一个类的实例中访问XIB文件中的变量,可以通过加载XIB文件,并将其作为子视图添加到当前视图中来实现。但是,如果需要访问XIB文件中的特定变量,需要将其设置为IBOutlet属性,并在需要访问的地方通过查找对应的视图来获取其值。
问题的原因是在另一个类中无法访问已存在的BottomNav实例。解决方法是将BottomNav实例化,并通过该实例访问curX属性。
文章如下:
在Swift 3中,我们有时候需要在一个类中访问另一个类中已存在的实例。下面是一个示例代码:
class BottomNav: UIView {
var view: UIView!
weak var homeBtn: UIView!
weak var scroller: UIScrollView!
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
这段代码可以正常工作,但是`let instance = BottomNav()`会创建一个新的实例,而不是访问已存在的实例。那么如何访问已存在的实例呢?
一种解决方法是将已存在的实例保存下来,并通过该实例访问curX属性。以下是示例代码:
let existingInstance = BottomNav()
existingInstance.curX = 30
通过这种方式,我们可以访问已存在的BottomNav实例,并修改其curX属性。
这个问题的解决方法让我意识到了我对视图和视图控制器的生命周期的理解还有一些空白。