2014-01-03 3 views
3

Мне любопытно, как использовать xib-файл для компоновки содержимого UITableViewCell. Когда я пытаюсь выполнить все шаги, которые я нахожу в Интернете я всегда получаюЗагрузка UITableViewCell из xib (этот класс не соответствует ключевому значению для ключа)

Нагрузочным приложение из-за неперехваченное исключение «NSUnknownKeyException», причины: «[< NSObject 0x10fe7d790 > SetValue: forUndefinedKey]: этот класс не является ключевым значением, совместимым с кодировкой для ключевого statusLabel. '

Так вот код, связанный с

@interface MyCell : UITableViewCell 

@property (nonatomic,strong) IBOutlet UILabel* messageLabel; 
@property (nonatomic,strong) IBOutlet UILabel* statusLabel; 

И в моем UIViewController я попытался как

-(void)viewDidLoad { 
    [self.tableView registerNib:[UINib nibWithNibName:@"MyCell" 
              bundle:[NSBundle mainBundle]] 
    forCellReuseIdentifier:@"CustomCellReuseID"]; 
} 

или с помощью

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"CustomCellReuseID"; 
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil] 
lastObject]; 
     // or sometimes owner is nil e.g. 
     //cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil] 
lastObject]; 
    } 

    // ... remainder of cell setup 

    return cell; 
} 

Оба этих подхода проваливается с исключение, упомянутое в названии. Похоже, что с владельцем: self ошибка происходит потому, что UIViewController не имеет свойств IBOutlet. С владельцем: nil это потому, что он внутренне использует NSObject, который, конечно же, также не имеет свойств IBOutlet.

Единственная работа, которую я нашел, заключается в следующем. В методе init для моей ячейки я добавляю возвращаемое представление/ячейку в свою ячейку инициализации

например.

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // nil out properties 

     [self.contentView addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil] lastObject]]; 
    } 
    return self; 
} 

Это кажется действительно фальшивым (хотя я могу и просто изменить базовый тип в XIb к UIView вместо MyCell или UITableViewCell), что делает его чувствовать себя немного меньше фальшивым.

Я видел много сообщений, в которых люди сталкиваются с этой конкретной ошибкой. Обычно это объясняется как проблема с подключением в самом xib, однако, если я удалю все соединения в xib, он загружается нормально, но в тот момент, когда я добавляю обратно соединение между элементом ui и владельцем файла, возвращается ошибка, поэтому я не думайте, что это имеет какое-либо отношение к «очистке» xib (даже если посмотреть на XML для xib, нет переуступаемых соединений).

Есть ли у кого-нибудь еще мысли о том, как возникает эта ошибка?

+0

Вы установили «Пользовательский класс» ячейки в файле Nib в «MyClass»? –

ответ

1

Вы подключили розетки для «messageLabel и statusLabel» в файле Cell Nib? Ошибка указывает, что свойство IBOutlet для «statusLabel» не найдено в файле Nib (проблема подключения).

+0

Он правильно подключен с помощью FileOwner.Ошибка говорит о том, что она не может найти statusLabel в NSObject (или в MYViewController, если я передаю этот контроллер как сам, так как владелец в loadNibNamed: owner: –

+1

Для загрузки видов из NIB, подключающихся к FileOwner, не работает, если только вид не является частью UIViewController. Вам нужно подключить выходы UITableViewCell в файле NIB к меткам. Для этого щелкните правой кнопкой мыши на UITableViewCell в своем NIB (вы можете найти его в левой панели под FileOwner) и подключить розетки. – gagarwal

+0

правильно, но правильное подключение для вашего пользовательского класса, а не для FileOwner. Когда вы перетаскиваете ссылку на выход, удаляете его в пользовательский класс в иерархии. Проблема заключается в том, что IB позволяет перетащить его в FileOwner и существует IBOutlet, как вы ожидаете, но он не работает Отбрасывание на пользовательский класс отображает те же выходные точки, но там оно работает. – John

0

Проверьте также Если MyCell.xib файл не является (ошибочно!) Добавляются в

Target Settings -> Build Phases -> Compile Sources 

Источники Компилировать являются для всех .m файлов и не для файлов ресурсов .xib.

И

Копирование Bundle ресурсов являются файлы ресурсов .xib.

Смежные вопросы