Objective- C: UItableView registerNib. Как? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть UIViewController и внутри него UITableView. Когда я регистрируюсь через registerClass, все работает, но игнорируя то, что находится внутри пользовательской ячейки: цвета, фон, подпредставления и т. Д. c (я создаю подклассы UITableViewCell). Когда я регистрируюсь через registerNib - он вылетает с сообщением об ошибке «Не удалось загрузить NIB в комплекте»

Здесь код:

- (void)viewDidLoad {

[super viewDidLoad];
[self.view addSubview:_pTableView];

[_pTableView registerClass:[Element1Cell class] forCellReuseIdentifier:@"Element1CellID"];
// [_pTableView registerNib:[UINib nibWithNibName:@"Element1Cell" bundle:nil] forCellReuseIdentifier:@"Element1CellID"];

}

В - tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath это:

oCell = [_pTableView dequeueReusableCellWithIdentifier:@"Element1CellID" forIndexPath:indexPath];

Чего мне не хватает? Некоторое время я не делал это для Objective- C.

(Пожалуйста, пишите только ответы Objective- C. Нет Swift.)

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

registerNib следует использовать, если ваша пользовательская ячейка определена в Nib / Xib, но если вы просто создаете подкласс пользовательской ячейки, то вы должны использовать registerClass, как вы делали

-(void)viewDidLoad {
   [super viewDidLoad];
   [self.view addSubview:_pTableView];

   [_pTableView registerClass:[Element1Cell class] 
      forCellReuseIdentifier:@"Element1CellID"];
}

, но во время для того чтобы получить доступ к свойствам / методам, объявленным в интерфейсе пользовательского класса, необходимо отменить возвращение ячейки (которая по интерфейсу является базовым классом), например

Element1Cell *oCell = (Element1Cell *)[_pTableView 
   dequeueReusableCellWithIdentifier:@"Element1CellID" forIndexPath:indexPath];

.

0 голосов
/ 03 мая 2020

Одна часть проблемы решена - игнорирование подпредставлений произошло из-за жизненного цикла. Я добавил метод, который настраивает ячейку, и теперь все работает. Решение:

  • В UITableViewCell определите настройки в layoutSubviews

    -(void) layoutSubviews {
    
        [super layoutSubviews];
    
        [self setBackgroundColor:__COLOR_BLUE];
    }
    
  • В UItableViewCell определите метод, который будет запускать установку после создания объекта

    -(void) mSetup {
    
        _pButtonAction = [[UIButton alloc] init];
        [_pButtonAction setTitle:@"Element 1 Button" forState:UIControlStateNormal];
        [_pButtonAction setTitleColor:__COLOR_BLACK forState:UIControlStateNormal];
        [_pButtonAction setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
        [_pButtonAction setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
        [_pButtonAction setContentEdgeInsets:UIEdgeInsetsMake(0, 10, 0, 0)];
        [_pButtonAction setBackgroundColor:__COLOR_WHITE];
        [_pButtonAction setTintColor:__COLOR_WHITE];
        [_pButtonAction addTarget:self action:@selector(mButtonAction) forControlEvents:UIControlEventTouchUpInside];
        [_pButtonAction setTranslatesAutoresizingMaskIntoConstraints:NO];
    
        [self.contentView addSubview:_pButtonAction];
        [[_pButtonAction.topAnchor constraintEqualToAnchor:self.topAnchor] setActive:YES];
        [[_pButtonAction.bottomAnchor constraintEqualToAnchor:self.bottomAnchor] setActive:YES];
        [[_pButtonAction.leftAnchor constraintEqualToAnchor:self.leftAnchor] setActive:YES];
        [[_pButtonAction.rightAnchor constraintEqualToAnchor:self.rightAnchor] setActive:YES];
    }
    
  • В UITableView add запустите функцию настройки после dequeueReusableCellWithIdentifier

    id oCell;
    ...
    oCell = (Element1Cell*)[_pTableView dequeueReusableCellWithIdentifier:@"Element1CellID" forIndexPath:indexPath];
    oCell = [oCell  mSetup];
    ...
    return (UITableViewCell*)oCell;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...