Класс не соответствует ключевым требованиям.

Я знаю смысл этой ошибки, но я действительно борюсь с ней, и мне нужна помощь:

2010-09-21 15:03:11.562 Stocks[5605:207] *** Terminating app due to uncaught 
exception 'NSUnknownKeyException', reason: '[<NSObject 0x499fb20> 
setValue:forUndefinedKey:]: this class is not key value coding-compliant 
for the key actionText.'

Здесь мой код:

AlertCell.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>


@interface AlertCell : UITableViewCell {
    IBOutlet UILabel *actionText;
}

@property (retain, nonatomic) UILabel *actionText;

@end

И

AlertCell.m

@implementation AlertCell
@synthesize actionText;

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

@end

Проблема происходит именно там:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    AlertCell *cell = 
      (AlertCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                                         owner:nil 
                                                       options:nil];
        for (id oneObject in nib) {
            if ([oneObject isKindOfClass:[UITableViewCell class]]) {
                cell = (AlertCell *)oneObject;
                break;
            }
        }
    }    


    cell.actionText.text = [arrayAlert objectAtIndex:indexPath.row];
    return cell;
}

В этой строке:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"AlertCell" 
                                             owner:nil 
                                           options:nil];

Как уже было сказано, вот мой заголовок для TableViewCOntroller:

#import <UIKit/UIKit.h>


@interface AlertesViewController : UITableViewController {
    NSMutableArray *arrayAlert;
}

И вы можете увидеть мой XIB файл (как XML): http://pastebin.com/FDVzLYZu

@end

Может ли кто-нибудь мне помочь? Большое спасибо!

67
21 сент. '10 в 16:33
источник поделиться
8 ответов

Есть несколько вариантов решения этой проблемы - я позволю вам решить, какой из них наиболее подходит.

Причина, по которой он терпит неудачу, заключается в том, что владелец передается как ноль. Вы связываете выход actionText с владельцем файла в IB, но затем при загрузке ниба владелец равен нулю. Я предполагаю, что при загрузке владельцем nil за сценой используется NSObject, поэтому вы получаете ошибку ключа/значения.

Мой предыдущий совет, чтобы передать ячейку, поскольку владелец также потерпел неудачу, поскольку я не знал, как построен Ниб; ячейка равна нулю, так как вы еще ее не создали (и dequeue передает нуль назад, поэтому даже передайте ячейку, поскольку владелец по-прежнему по существу пропускает ноль).

Два варианта:

  • Создайте новую ячейку в своей реализации -cellForRowAtIndexPath: (NSIndexPath *) indexPath и передайте эту новую ячейку в качестве владельца (но я бы предположил, что это не лучшее решение для вас)
  • Или, и я бы предложил, что это лучшее решение, измените привязку actionText в вашем файле nib к ячейке оповещения, а не владельцу файла (у вас есть владелец файла и ячейка предупреждения) привяжите UILabel к actionText выход из Alert Cell, а не владелец файла, что и делается сейчас). Я подозреваю, что это то, что вы хотите. Имея это в виду, владелец файла может снова стать NSObject.

------- Исходный ответ сохраняется ниже, поскольку класс владельца файла также является общей причиной этой ошибки -------

Это предполагает, что вы "создавали экземпляр" AlertCell в InterfaceBuilder, и вы привязываете что-то к файлу actiontext, но класс не настроен на AlertCell, он все еще NSObject?

Взгляните на текстовое поле класса на вкладке идентификации палитры инструментов для этого объекта в Interface Builder. Класс должен быть AlertCell, но я предполагаю, что он все еще установлен в NSObject.

В стороне и не стесняйтесь игнорировать этот совет, но есть несколько дополнительных вещей, которые я бы рекомендовал вам сделать, исключительно с точки зрения ожиданий/соглашений Objective C:

  • Назовите свои файлы после вашего класса (верхний регистр - первый символ имени файла).
  • Префикс имен вашего класса; два заглавных буквы, обычно ваши инициалы (например, я бы назвал его DWAlertCell).
84
21 сент. '10 в 16:36
источник

Связанные вопросы


Похожие вопросы

вы, вероятно, основывали свой код на веб-учебном пособии, например, на http://www.e-string.com/content/custom-uitableviewcells-interface-builder или http://www.icodeblog.com/2009/05/24/custom-uitableviewcell-using-interface-builder/

Ваша проблема (и я на 99% уверен, что это то, с чем вы споткнулись, я просто сделал ту же ошибку) заключается в том, что в построителе интерфейса вы связали свои IBOutlets с файловым владельцем, когда вы должны связать их с видом ячейки. Вот почему вы получаете ошибки.

98
21 июля '11 в 8:15
источник

У меня была та же проблема, и я не мог найти упомянутый переменный/элемент в любом файле. Я выполнил следующие шаги.

Окружающая среда: Xcode 6

  • Перейдите в Xib файл и щелкните правой кнопкой мыши (Ctrl + Mouse Click) в каждом пользовательском интерфейсе. чтобы увидеть его ассоциации.
  • В разделе справочных точек вы сможете найти ошибочная ассоциация.
  • Удалить эту ассоциацию
  • Очистите решение и создайте папку
  • Reset Симулятор
  • Перестроить и запустить проект.
7
19 окт. '14 в 22:00
источник

проверить UIControl Ссылка на имя свойства OutLet из файла nib/StoryBoard

5
12 окт. '14 в 10:48
источник

Убедитесь, что ячейка select помещает пользовательский класс не Owner Owner для добавления пользовательского класса с правой стороны сверху и если вы это сделали, прежде чем делать какие-либо изменения, удалите выходное соединение, а затем удалите пользовательский класс из владельца файла и добавьте представление класса в ячейку

4
18 февр. '13 в 11:02
источник

Может быть, это помогает: Indentity Inspector , когда вы выбрали владельца файла - UITableViewCell,                    , когда вы выбрали ячейку внутри объектов. Пользовательский сотовый ящик

3
09 окт. '12 в 15:06
источник

Через 2 часа я понял, что забыл

@synthesize tableView = _tableView;

Надеюсь, что это поможет.

Мариу

2
02 авг. '12 в 14:24
источник
#import <UIKit/UIKit.h>

@interface ReceptionDetailCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *productName;

@property (weak, nonatomic) IBOutlet UILabel *billType;

@property (weak, nonatomic) IBOutlet UILabel *bookTime;

@property (weak, nonatomic) IBOutlet UILabel *doctorName;

@property (weak, nonatomic) IBOutlet UILabel *downBillManName;




@end

Ознакомьтесь с настройками сотового кода и раскадровки, независимо от того, все ли они существуют, возможно, вы изменили свои имена.

0
15 янв. '15 в 9:20
источник

Посмотрите другие вопросы по меткам или Задайте вопрос