Подключение IBOutlet к ViewController, управляемому UITabBarController - PullRequest
1 голос
/ 24 августа 2009

Я получаю сумасшедшую ошибку и не могу понять, почему это происходит. Я сделал простое приложение, которое использует TabBar для навигации по 3 представлениям. Я создал все и добавил один UIImageView к каждому из 3 ViewControllers, которыми управляет TabBar. Все отлично работает В приложении вы можете перемещаться по 3 видам и видеть 3 изображения.

Теперь я добавляю одну UIButton (или любой другой компонент) к 1-му ViewController. Я добавляю его в NIB и в своем коде делаю как обычно:

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

@synthesize btn;
[btn release];

и подключите кнопку UIB в моем NIB к «btn». Теперь приложение вылетает, как только TabBar пытается показать это представление (которое сразу после запуска), давая мне:

2009-08-24 16: 52: 25.164 AppName [2249: 207] *** Завершение приложения из-за неисследованного исключения NSUnknownKeyException, причина: «[ setValue: forUndefinedKey:]: этот класс не соответствует кодировке значения ключа для ключ btn. '

Я попытался перезапустить SDK, мой компьютер, собрать для 2.2.1, 3.0, для симулятора, для устройства, очистить все цели и т. Д., Но проблема остается. Я уверен, что это как-то связано с UITabBarController. Я просто не вижу, что.

Ответы [ 6 ]

3 голосов
/ 30 октября 2009

У меня была похожая проблема. Это произошло потому, что для UIViewController для вкладки не был указан определенный подкласс UIViewController, который я создал.

Если вы посмотрите на .xib в IB, вы увидите что-то вроде этого:

  **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

View Controllers под контроллером панели вкладок по умолчанию будет базовым 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 не называется

2 голосов
/ 24 августа 2009

Вы получите эту ошибку при подключении элемента управления к несуществующей розетке.

Самая важная часть вашего сообщения об ошибке пропущена (потому что оно было заключено в угловые скобки):

reason: [<classname> setValue:forUndefinedKey:

classname - это класс, к которому вы, возможно, непреднамеренно подключили кнопку в Интерфейсном Разработчике. У него нет btn розетки.

1 голос
/ 25 августа 2009

Кажется, проблема была вызвана UITabBarController в моем NIB MainWindow. Я не мог это исправить, поэтому я удалил UITabBarController из NIB и создал его в коде в своем классе AppDelegate. Затем я установил для всех остальных классов значение «initWithNib», и теперь я могу установить в них IBOutlets.

0 голосов
/ 08 декабря 2009

У меня была эта проблема сегодня. Причина: Я определил IBOutlet в моем делегате и подключил его. Позже я удалил его из файла кода. Тем не менее, ссылка все еще была активна в файле XIB. Это было серым. Помогло удаление ссылки в XIB.

Я делал что-то еще, поэтому я подумал, что проблема была в новом компоненте, который я добавил, не осознавая, что это вызвано этим.

0 голосов
/ 12 сентября 2009

Я недавно столкнулся с этой точной ошибкой и обнаружил, что выполнение цели «Очистить все» решило проблему. Может быть так просто.

0 голосов
/ 24 августа 2009

Я предполагаю, что ваши 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

Полагаю, вы поставили все биты в правильное место, но, как я уже сказал, стоит еще раз проверить!

...