将IBOutlet连接到由UITabBarController管理的ViewController

时间:2009-08-24 16:03:12

标签: iphone objective-c interface-builder uitabbarcontroller

我遇到了一个疯狂的错误,我无法理解为什么会这样。 我做了一个简单的应用程序,使用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有关。我只是看不出来。

6 个答案:

答案 0 :(得分: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

然后当标签为您的标签创建控制器时,它将创建正确的类。请注意,这可能是您未调用viewDidLoad方法的原因

答案 1 :(得分:2)

将控件连接到不存在的插座时,会出现该错误。

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

reason: [<classname> setValue:forUndefinedKey:

classname 是您可能无意中将该按钮连接到Interface Builder中的类。它没有btn插座。

答案 2 :(得分:1)

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

答案 3 :(得分: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

我希望你把所有的东西放在正确的位置,但就像我说的那样值得仔细检查!

答案 4 :(得分:0)

我最近遇到了这个确切的错误,发现只是做一个Clean All目标修复了这个问题。可能就这么简单。

答案 5 :(得分:0)

我今天遇到了这个问题。原因: 我在我的委托中定义了IBOutlet,并将其连接起来。后来我从代码文件中删除了它。但是,该引用仍在XIB文件中处于活动状态。它变灰了。删除XIB中的引用有助于。

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