【问题标题】:Programmatically set an IB object's Class以编程方式设置 IB 对象的类
【发布时间】:2013-08-31 03:30:18
【问题描述】:

在使用 Interface Builder 时,很多时候我会将 Class 属性设置为我的自定义类之一。假设我在笔尖中有一个 UIView,我将类设置为我的 MyView 类。

这一切都很好,即使以编程方式加载笔尖也是如此。

但是,有没有办法在以编程方式加载 nib 时设置 UI 控件的 Class?原因是我有时想使用在 IB 中创建的相同 nib,但将它与不同的类关联。

【问题讨论】:

    标签: ios objective-c xcode cocoa-touch interface-builder


    【解决方案1】:

    我认为没有适当的方法可以以编程方式实现这一目标。

    您可以在 IB 中创建一个裸 UIView 对象并为其指定标签或将其分配给 IBOutlet 以进行标识,以便您可以在 viewDidLoad 中以编程方式访问它。

    在 viewDidLoad 中,您可以访问它并获取它的框架和超级视图以及可能的背景颜色、alpha、隐藏状态等,以便您可以在 IB 中设置所有这些值。然后从其父视图中删除 UIView 并将属性(如果有)或分别释放对象(取决于 ARC 与否)。然后创建您需要的 UI 元素,将其分配给属性(如果有),将其添加到前 UIView 的父视图中,相应地设置其框架和属性,然后从那里开始。

    (Obj-C 中有一些方法可以在实例化后更改对象的类,但我不建议在这种情况下这样做,尤其是当您的子类带有其他属性和 ivars 时。)

    【讨论】:

    • 感谢您的详尽解释——您说服了我。在玩的时候,我决定通过在我的 UIView 类中使用委托来做一些我最初尝试继承的小事情(以及我的问题)。这对我来说现在感觉好多了,而且更像可可。
    【解决方案2】:

    尝试使用 Objective c 运行时的“object_setClass(id object, Class cls)”方法。祝你好运:)

    【讨论】:

    • 你应该解释这个提议的后果和限制。 Isa swizzling 很复杂。
    • 要使用object_setClass(id object, Class cls)方法你必须使用#include <objc/runtime.h>
    【解决方案3】:

    通常您使用 Interface Builder 在 UIViewController 的类 XIB 文件上创建一个 UIView 对象,然后使用 Identity Inspector 中的自定义类工具将 UIView 与一个类相关联(该类是一个 UIView 类,其中包含用于绘制的代码UIView 对象。)。然后,您必须在 UIViewController 类中使用 @property 和 @systhesize 将 UIView(使用连接检查器)连接到您的类。这种方法是可以的,但在某些情况下它有局限性。

    您可以务实地解决所有这些问题。

    创建将用于在 UIView 对象上绘图的 UIView 类。在这个类中,您创建上下文引用 (CGContextRef) 为绘图工具提供上下文(在哪里绘制),例如字符串、线条、圆等。即

    CGContextRef gg = UIGraphicsGetCurrentContext();
    

    在 UIViewController 类中,您需要在 .h 文件中导入对 UIView 类的引用。我们称之为:DrawOnView

    #import "DrawOnView.h"
    

    然后在包含@interface 的括号中放置这一行:

    UIView * draw;  // draw can be changed to any name that suits your needs
    

    然后在viewDidLoad方法里面类的.m部分你需要插入这段代码:

     // Make the size and location that suits your needs
     // You can change this on the go in your code as needed, such as if the
     // device orientation is changed.
     draw = [DrawOnView alloc] initWithFrame:CGRectCreate(50, 50, 100, 200)];
     // You can change the background color of the view, if you like:
     [draw setBackGroundColor:[UIColor greenColor]];
     // Now add the view to your primary view
     [self.view addSubview:draw];
    

    现在,在我们程序的其他部分,您可以使用以下引用调用您在 DrawOnView 类中声明的方法和刷新(它调用 drawRect 方法,您的 UIView 类中的主要入口点):

    [(DrawOnView*) draw setNeedsDisplay];
    

    这是非常重要的。不要使用:

    [draw setNeedsDisplay];  // This will not work!
    

    假设您在 DrawOnView 中定义了其他方法并想要调用它们。

    这是一个示例方法(在 .h 文件中):

    -(BOOL) wasHotSpotHit: (CGPoint) p;
    

    实际的方法可能如下所示(在 .m 文件中):

     -(BOOL) washHotSpotHit: (CGPont) p 
     {
       if(CGRectContainsPont(hotspot.frame, p))
       {
          return true;
       }
       return false;
     }
    

    使用这样的代码:

     if([(DrawOnView*) draw testIfSpotHit:p])
     {
         // Do something for when user touches hot spot.
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-19
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多