【问题标题】:Cannot load custom view from nib into another view made programmatically?无法将自定义视图从笔尖加载到以编程方式制作的另一个视图中?
【发布时间】:2024-01-21 05:27:01
【问题描述】:

查看其他一些问题,这是我在实现自定义键盘的视图的 .m 中实现的代码。

- (id)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {

    self.userInteractionEnabled = YES;

    [self addGestureRecognizer:
     [[UITapGestureRecognizer alloc] initWithTarget:self
                                             action:@selector(becomeFirstResponder)]];


   NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"FormulaKeyboard" owner:self options:nil];

    for (id object in bundle) {
        if ([object isKindOfClass:[FormulaKeyboard class]])
            keyboard = (FormulaKeyboard *)object;
    }   


    self.inputView = keyboard;





}
return self;

}

下面是出现的错误。

* 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:该类与键视图的键值编码不兼容。”

当我将笔尖加载到实际的视图控制器中时,它可以正常工作。但是,如上所述,当我尝试将其加载到另一个视图中时,它不起作用。

另外,在 nib 中,我将文件所有者的类设置为 UIViewController 并将其附加到主视图,因为这是另一个 SO 问题所指示的。我不确定是否需要修改它,因为我将自定义视图添加到另一个视图而不是 viewc 控制器中。

谢谢

编辑:

实现键盘的视图.h

@interface EquationTextField : UIView <KeyInput> {

FormulaKeyboard *keyboard;

}

@property (readwrite, retain) UIView *inputView;
@end

【问题讨论】:

    标签: objective-c ios view uiview


    【解决方案1】:

    xib 内部,如果您使用ctrl + click File's Owner,您很可能会看到您有一个view 出口,该出口连接到view 中的*view 对象@ .

    1. 在您的代码中引用 IBOutlet
    2. 引用 Interface Builder 中的对象

    这在UIViewController 中起作用的原因是UIViewController 有一个属性view,它在加载xib 时被连接起来。

    UIView 子类通常没有名为 view 的属性,因此您会遇到异常。

    似乎您正在从loadNibNamed:owner:options: 方法返回的*对象数组中获取项目,您在xib 中不需要此连接。因此,您可以在xib 文件中断开此连接。

    或者

    你可以:

    • File's Owner 类更改为您的自定义视图的类。
    • inputView 设为IBOutlet
    • inputView 连接到xib 中的自定义键盘
    • 那就用

      [[NSBundle mainBundle] loadNibNamed:@"FormulaKeyboard" owner:self options:nil];
      

    【讨论】:

    • 我删除了xib中的连接。它现在运行良好,但是当我单击视图时它们的键盘不显示。我已经添加了应该在问题中显示键盘的代码。谢谢
    • 我尝试添加不同的视图作为 inputView 甚至去掉 inputView 属性,但键盘根本没有出现。
    • 如果这个self.inputView = keyboard; 是应该调出键盘的代码,它不会按照你的想法做。这只是将keyboard 分配给名为inputView 的ivar,您还需要将其添加到视图层次结构中,例如[self addSubview:keyboard];
    • 你确定nil != keyboard了吗?
    • 您发布的代码与您拥有的代码相同吗? keyboard 是在哪里声明的?
    【解决方案2】:

    您的视图似乎没有名为“inputView”的属性,因此当您在 self 上设置该属性时,您会遇到异常。

    【讨论】:

      最近更新 更多