1

我得到一个疯狂的错误,我无法理解它为什么会发生。我制作了一个简单的应用程序,它使用 TabBar 来导航 3 个视图。我创建了所有内容,并向 TabBar 管理的 3 个 ViewController 中的每一个添加了一个 UIImageView。一切正常。在应用程序中,您可以浏览 3 个视图并查看 3 个图像。

现在我将一个 UIButton(或任何其他组件)添加到第一个 ViewController。我将它添加到 NIB 中,并在我的代码中执行通常的操作:

IBOutlet UIButton *btn;
@property (nonatomic, retain) IBOutlet UIButton *btn;

@synthesize btn;
[btn release];

并将我的NIB中的UIButton连接到“btn”。现在,一旦 TabBar 尝试显示此视图(在它启动后立即显示),应用程序就会崩溃,给我一个:

2009-08-24 16:52:25.164 AppName[2249:207] *** 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合键值编码钥匙 btn。

我尝试重新启动 SDK、我的计算机、为 2.2.1、3.0、模拟器、设备、清理所有目标等构建,但问题仍然存在。我确信它与 UITabBarController 有关。我只是看不出是什么。

4

6 回答 6

3

我有一个类似的问题。这是因为选项卡的 UIViewController 未设置为我创建的 UIViewController 的特定子类。

如果您查看 IB 中的 .xib,您会看到如下内容:

  **Name**                **Type**
  File's Owner        UIApplication
  First Responder     UIResponder
  Tab Bar Controller  UITabBarController
     Tab Bar          UITabBar
     View Controller  UIViewController
     View Controller  UIViewController
     View Controller  UIViewController

标签栏控制器下的视图控制器将默认为基本的 UIViewController。您需要将他们的类更改为您的子类视图控制器,以便他们正确加载并连接到您的插座:

  **Name**                **Type**
  File's Owner        UIApplication
  First Responder     UIResponder
  Tab Bar Controller  UITabBarController
     Tab Bar          UITabBar
     FirstTab View Controller  MyFirstTabController
     SecondTab View Controller MySecondTabController
     ThirdTab View Controller  MyThirdTabController

Then when the tab creates the controller for your tab it will be creating the correct class. 请注意,这可能是未调用 viewDidLoad 方法的原因

于 2009-10-30T04:55:21.313 回答
2

当您将控件连接到不存在的插座时,您将收到该错误。

您的错误消息中最重要的部分被遗漏了(因为它被包裹在尖括号中):

reason: [<classname> setValue:forUndefinedKey:

classname是您可能无意中在 Interface Builder 中将按钮连接到的类。它没有btn出口。

于 2009-08-24T19:19:50.657 回答
1

该问题似乎是由我的 MainWindow NIB 中的 UITabBarController 引起的。我无法修复它,所以我从 NIB 中删除了 UITabBarController 并在我的 AppDelegate 类的代码中创建它。然后我将所有其他类设置为“initWithNib”,现在我可以在它们中设置 IBOutlets 就好了。

于 2009-08-25T11:05:44.443 回答
0

我假设您的 4 行代码都在正确的位置?值得仔细检查,因为看起来编译器认为您打算为 btn 做一些不同的事情。

因此,值得仔细检查您的 4 行是否如下所示:

// in your myController.h file

@interface myController:UIViewController {    
IBOutlet UIButton *btn;
}

@property (nonatomic, retain) IBOutlet UIButton *btn;
@end

// in your myController.m file

@implementation myController    
@synthesize btn;

- (void)dealloc {
   [btn release];
   [super dealloc];
}

@end

我希望您已将所有位都放在正确的位置,但就像我说的那样,值得仔细检查!

于 2009-08-24T16:25:09.763 回答
0

我最近遇到了这个确切的错误,并发现只需执行 Clean All 目标即可解决问题。可能就这么简单。

于 2009-09-12T14:47:03.107 回答
0

我今天遇到了这个问题。原因:我在我的委托中定义了 IBOutlet,并连接了它。后来我从代码文件中删除了它。但是,该引用在 XIB 文件中仍然有效。它变灰了。删除 XIB 中的引用有所帮助。

我正在做其他事情,所以我认为问题出在我添加的新组件中,没有意识到这是由此引起的。

于 2009-12-08T14:32:54.813 回答