【问题标题】:confused difference between Custom Class for an Object and for the File's Owner and steps via IB对象和文件所有者的自定义类之间的混淆差异以及通过 IB 的步骤
【发布时间】:2013-02-15 12:57:24
【问题描述】:

这是另一个“我很困惑的问题”。所以我正在努力将自定义视图引入视图控制器。我将概述错误的确切步骤。

  1. 创建单视图应用程序项目
  2. 通过文件 -> 新建 -> 用户界面 -> 视图创建一个 Nib 文件;称之为NIB.xib。添加一个简单的标签以确保加载。
  3. 添加以下代码:

    UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" owner:self options:nil] objectAtIndex:0];
    view.frame=CGRectMake(10.0f,10.0f,100.0f,100.0f);
    view.backgroundColor=[UIColor orangeColor];
    [self.view addSubview:view];
    

这行得通。

现在我要做的是将此笔尖与 UICustomView 连接,因此我通过 File -> New -> UIView 创建 ArcView。

'4.在 IB 中,我需要将 NIB 连接到 ArcView,因此我在占位符中突出显示文件的所有者并在自定义类中选择 AcrView。

'5.'然后我选择主视图并将其设置为自定义类中的 ArcView。

我不知道下一步是什么,或者是否需要 4 或 5(两者/都不需要)?我是否尝试在 ArcView 中创建插座引用以查看 Interface Builder 中的主视图?我是否可以在助手编辑器中从视图中按住 Alt 键拖动到头文件(我目前无法)?

提前谢谢

** 编辑 1 **

这是设置了 arcView 的文件所有者:

未设置 arcView 的视图对象:

【问题讨论】:

  • list 和 markdown 的问题,所以只需在其周围添加单引号。

标签: ios uiview ios6


【解决方案1】:

在父类的@interface 部分定义一个 IBOutlet @property,如下所示:

@property (weak, nonatomic) IBOutlet ArcView *arcView

然后进入 Interface Builder,并右键单击 File's Owner。当您在黑色 HUD 窗口中看到“arcView”时,将鼠标从该项目拖动到您在 XIB 上的视图。

现在您有了 arcview 控件的属性,您可以像使用任何控件(如 UIButton、UILabel 等)一样使用它。

【讨论】:

  • thx - 我更新了,但使用 2013-02-28 22:54:24.066 Sam[22922:11303] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0xa98cf70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key arcView.' 崩溃了,请参阅上面的编辑 #1 以获取屏幕截图
【解决方案2】:

设置文件的所有者 == 您的 UIView 子类,以便您可以将插座连接到它。您应该将笔尖绘制的 UIView 的类设置为同一个子类,因为它是该 UIView 子类的一个实例。

换句话说,请按照以下步骤操作:

  1. 创建一个名为 CustomView 的 UIView 子类
  2. 创建 UIView xib 新文件 -> 用户界面 -> 视图
  3. 将文件的所有者更改为 CustomView
  4. 将视图的类更改为 CustomView
  5. 如果您愿意,可以添加子视图,将它们作为出口连接到文件所有者 (CustomView)

您的崩溃正在发生,因为您的代码这样说:

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" owner:self options:nil] objectAtIndex:0];

但是 owner:self 是运行此代码的视图控制器。您希望视图子类成为 nib 的所有者。

要解决此问题,请让您的 UIView 子类从 nib 初始化自身,如下所示:

CustomView.h

@interface CustomView : UIView

- (id)initFromNib;

@end

CustomView.m

#import "CustomView.h"

@interface CustomView ()
// connect this in the XIB to file's owner that you've set to this CustomView class
@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@end

@implementation CustomView

- (id)initFromNib
{
    self = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];

    if (self) {
        // prove you can set properties on your outlets
        self.myLabel.text = @"this is good";
    }
    return self;
}

我建立了一个小项目,里面只有这些东西,就像描述的那样。工作正常。让我知道您是否想看它,我会想办法给您发送一个匿名 zip。

【讨论】:

  • 我认为这是理解在 XIB 中设置 File's Owner 和 Class 之间区别的最佳解释。我已经经历了很多关于这些的问题和答案,但无法清楚地理解差异。但是,这对我来说非常清楚。特别是@danh 编写的步骤和代码。这个答案值得这么多赞成。非常感谢。
  • 设置所有者后将视图的类更改为CustomView有什么意义?
  • @nrudnyk,nib 中的视图类决定了在加载 nib 时实例化的对象的类。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2020-11-02
相关资源
最近更新 更多