Пользовательский UITableCellVew, когда есть ссылка на выход, подключенный в IB - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь использовать пользовательские UITableViewCells, определенные в IB, где есть ссылки на выходы. Я успешно использовал методы, показанные в нескольких местах в stackoverflow, для загрузки и использования UITableViewClass, когда нет ссылки на выход, как показано ниже.

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TheCellsClass" owner:nil options:nil];

У меня есть отдельный файл с именем «TheCellsClass.xib», в котором есть один UITableViewCell, определенный с одним UILable с именем Alabel, «IBOutlet UILabel * Alabel;». Если я подключу метку к ALabel, то получу эту ошибку

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x681b360> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Alabel.'

После поиска здесь и в Интернете я понимаю, что это связано с тем, что "owner: nil" не определяет класс с этим объектом: Alabel. Я не могу использовать «owner: self», потому что это UITableViewController, а также не определяет «Alabel».

Я создал класс с именем «TheCellsClass» как подкласс «UITableViewCell», который определяет Alabel, см. Ниже;

Тогда использовали:

        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TheCellsClass" owner:cell options:nil];

Я все еще получаю ту же ошибку. Итак, кто-нибудь может указать на ошибку моих путей? :-) Единственный способ решить эту проблему - удалить все ссылки и подключить их используя код

Заголовок подкласса:

#import <UIKit/UIKit.h>
@interface TheCellsClass : UITableViewCell {   
    IBOutlet UILabel *Alabel;    
}
@property (strong, nonatomic) UILabel *Alabel;
@end

Тело подкласса:

#import "TheCellsClass.h"
@implementation TheCellsClass
@synthesize Alabel;
@end

В табличном представлении контроллер

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

Я использую:

TheCellsClass* cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TheCellsClass" owner:cell options:nil];

Здесь находится образец проекта http://www.proaa.com/tryout.zip

Предложения? Запросы на дополнительную информацию?

Любая помощь приветствуется. Geoff

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Три вещи:

  1. Удалить TheCellClass из DetailViewController.xib

  2. ALabel связан с владельцем файла в TheCellsClass - вместо этого свяжите его с TheCellsClass в разделе «Объекты». Также рассмотрите возможность переименования ALabel - это стандартное именование переменных экземпляра, начинающихся со строчной буквы.

  3. В MasterViewController измените

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TheCellsClass" owner:cell options:nil];
    

до

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TheCellsClass" owner:nil options:nil];

После этих трех изменений ваш симулятор TableViewCell появился в симуляторе. Также рассмотрите возможность переименования TheCellsClass во что-то, что намекает на то, что это подклассы, например MyCustomTableViewCell.

0 голосов
/ 21 ноября 2011

Не глядя на ваш проект, одна вещь приходит на ум. Если у вас есть экземпляр вашей пользовательской ячейки в нашем nib, а затем у вас есть этот ярлык в том же nib, то соединение должно быть от UILabel до пользовательской ячейки. Не следует подключать его к владельцу файла, по крайней мере, так, как вы описали, чего вы пытаетесь достичь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...