【问题标题】:Is there a way to tell what nib my UIView has awoken from?有没有办法告诉我的 UIView 是从哪个笔尖唤醒的?
【发布时间】:2011-07-08 09:05:30
【问题描述】:

我有一个 UIView 的子类,可以从各种 nib 初始化。有什么方法可以从我的 UIView 类中访问它初始化的笔尖吗?

正如你在下面看到的,目前我设置了标签,然后能够在我的类中检查该值,但我只是好奇 UIViews 是否知道它们附加到什么笔尖,或者是否有通过解码器访问它的某种方式。 Mahalo,如果有人知道的话。

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:viewNibName owner:self options:nil];
self.viewInstance = (ViewClass *)[nibViews objectAtIndex:0];
self.viewInstance.tag = VIEW_INSTANCE_ID;

【问题讨论】:

    标签: iphone ios uiview uikit


    【解决方案1】:

    为什么不直接继承 UIViewController(及其主视图)而不是 UIView...? UIViewControllers 有 2 个属性:“nibName”和“nibBundle”,可以满足您的要求...

    【讨论】:

    • 我一次将一些这样的视图对象添加到屏幕上,并认为如果我能侥幸成功的话,只使用 UIView 会更轻量级。
    【解决方案2】:

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

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

    也就是说,我不建议这样做。如果你有一个视图类,它的行为取决于加载它的 nib,我认为这是一个强烈的信号,表明你的代码应该被重构。我要么将依赖于 nib 名称的代码移动到控制器类,要么将代码拆分为两个或多个单独的视图类。

    【讨论】:

      【解决方案3】:

      这样就可以了:

      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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-28
        • 2012-02-20
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        相关资源
        最近更新 更多