我有一个UIView的子类,可以从各种nib初始化。有没有办法从我的UIView类中访问它被初始化的nib?
正如你在下面看到的,目前我设置了标签,然后我可以从我的班级中检查这个值,但我只是好奇,如果UIViews无论如何都知道他们附加了什么nib,或者是否有通过解码器访问它的一些方法。 Mahalo如果有人知道的话。
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
self.viewInstance = (ViewClass *)[nibViews objectAtIndex:0];
self.viewInstance.tag = VIEW_INSTANCE_ID;
答案 0 :(得分:3)
我不相信目前有一个很好的方法可以让对象找出它正在加载的nib。请记住:任何实现NSCoding的对象都可以存储在nib文件中,而不仅仅是视图中。如果有办法找到,可能是通过调用NSKeyedArchiver或NSCoder中的方法,我没有看到任何东西。
如果您确实认为自己需要此功能,我建议使用“ - (NSString *)nibName”等方法定义协议,并在加载nib的类中实现它。然后,您可以将视图连接到nib中的“文件所有者”代理图标,并且可以查询nib所有者以获取nib的名称。 UIViewController已经有-nibName和-nibBundle方法,因此在大多数情况下这只需要很少的工作。
那就是说,我不建议做这样的事情。如果你的视图类的行为有所不同,具体取决于加载它的nib,我会把它作为一个强有力的信号,你的代码应该重新计算。我要么将依赖于nib名称的代码移动到控制器类,要么将代码拆分为两个或多个单独的视图类。
答案 1 :(得分:1)
为什么不直接使用UIViewController(及其主视图)而不是UIView ...? UIViewControllers有2个属性:“nibName”和“nibBundle”可以做你想要的......
答案 2 :(得分:0)
这样做:
private var nibNameAssociationKey: UInt8 = 0
extension UIView {
var nibName: String {
get {
return objc_getAssociatedObject(self, &nibNameAssociationKey) as String
}
set(newValue) {
objc_setAssociatedObject(self, &nibNameAssociationKey, newValue, UInt(OBJC_ASSOCIATION_RETAIN))
}
}
class func loadFromNibNamed(nibNamed: String, bundle : NSBundle? = nil) -> UIView? {
var view = UINib(nibName: nibNamed, bundle: bundle).instantiateWithOwner(nil, options: nil)[0] as? UIView
view?.nibName = nibNamed
return view
}
}
用法:
var someView = SomeView.loadFromNibNamed("SomeSubviewOfSomeView") as SomeView?
...
var myNibName = someView!.nibName // will be "SomeSubviewOfSomeView"