2011-03-03 125 views
1

我有一个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; 

回答

3

我不相信目前有一个好的方法来找出它是从哪个nib加载。记住:任何实现NSCoding的对象都可以存储在一个nib文件中,而不仅仅是视图。如果有办法找出,它可能是通过调用NSKeyedArchiver或NSCoder中的方法,并且我没有看到任何东西。

如果你真的认为你需要这种能力,我建议定义的协议中包含的方法“ - (的NSString *)nibName”,并在你的类时装载笔尖实现它。然后,您可以将您的视图连接到“文件的所有者”的代理在笔尖图标,它可以查询笔尖业主为笔尖的名称。 UIViewController已经有了-nibName和-nibBundle方法,所以在大多数情况下这只需要很少的工作。

这就是说,我不会推荐做这样的事情。如果你有一个视图类的行为有所不同,取决于加载它的nib,我会把它看作是一个强烈的信号,你的代码应该被重新考虑。我要么将依赖于nib名称的代码移动到控制器类,要么将代码拆分为两个或多个单独的视图类。

1

为什么不直接继承UIViewController(以其主视图)而不是UIView ...? UIViewControllers有2个属性:“nibName”和“nibBundle”,可以做你在问什么...

+0

我同时加入了许多这些视图对象到屏幕并推断它会更轻巧,只需使用UIView如果我能摆脱它。 – 2011-03-04 16:52:45

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" 
相关问题