有没有办法告诉我的UIView从哪个nib醒来?
我有一个UIView的子类,可以从各种笔尖初始化。有没有什么办法可以从我的UIView类中访问它初始化的笔尖呢?有没有办法告诉我的UIView从哪个nib醒来?
正如您在下面看到的,目前我设置了标签,然后能够从我的课程中检查该值,但我只是好奇UIViews是否意识到它们连接的是哪个笔尖,或者如果有是通过解码器访问它的某种方式。马哈洛,如果有人知道。
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
self.viewInstance = (ViewClass *)[nibViews objectAtIndex:0];
self.viewInstance.tag = VIEW_INSTANCE_ID;
我不相信目前有一个好的方法来找出它是从哪个nib加载。记住:任何实现NSCoding的对象都可以存储在一个nib文件中,而不仅仅是视图。如果有办法找出,它可能是通过调用NSKeyedArchiver或NSCoder中的方法,并且我没有看到任何东西。
如果你真的认为你需要这种能力,我建议定义的协议中包含的方法“ - (的NSString *)nibName”,并在你的类时装载笔尖实现它。然后,您可以将您的视图连接到“文件的所有者”的代理在笔尖图标,它可以查询笔尖业主为笔尖的名称。 UIViewController已经有了-nibName和-nibBundle方法,所以在大多数情况下这只需要很少的工作。
这就是说,我不会推荐做这样的事情。如果你有一个视图类的行为有所不同,取决于加载它的nib,我会把它看作是一个强烈的信号,你的代码应该被重新考虑。我要么将依赖于nib名称的代码移动到控制器类,要么将代码拆分为两个或多个单独的视图类。
为什么不直接继承UIViewController(以其主视图)而不是UIView ...? UIViewControllers有2个属性:“nibName”和“nibBundle”,可以做你在问什么...
这将做到这一点:
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"
我同时加入了许多这些视图对象到屏幕并推断它会更轻巧,只需使用UIView如果我能摆脱它。 – 2011-03-04 16:52:45