Использование dequeueReusableCellWithIdentifier с пользовательским UITableViewCell - PullRequest
0 голосов
/ 14 декабря 2011

Так что я не уверен, как работает этот dequeueReusableCellWithIdentifier и возможно ли то, что я ищу. У меня есть пользовательский UITableViewCell с BOOL showIcon. В TableViewCell, если это правда, я показываю это, в противном случае я не показываю этот значок в своей ячейке. В моем cellForRowAtIndexPath я извлекаю объект в моем массиве из моей модели и устанавливаю его для свойства UITableViewCell.

Сначала это работает на том, что видно на моем экране. Затем, когда я прокручиваю таблицу вниз, она не работает, и значения, которые я должен видеть для showIcon, просто не отображаются. И потом, когда я прокручиваю назад вверх, оригинальных значков, которые были там, там нет. Является ли dequeueReusableCellWithIdentifier все еще тем, что я хочу использовать в этом случае? Или я что-то не так настраиваю и показываю в нем данные? Огромное спасибо.

КОД:

На моем пользовательском UITableViewCell у меня есть

BOOL showIcon;

В моем методе cellForRowAtIndexPath я использую способ UINib для получения своего пользовательского UITableViewCell следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    static NSString *OrderTableViewCellIdentifier = @"OrderTableViewCellIdentifier";
    OrderTableViewCell *cell = (OrderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OrderTableViewCellIdentifier];
    if (cell == nil) {
        UINib *cellNib = [UINib nibWithNibName:@"OrderTableViewCell" bundle:nil];
        [cellNib instantiateWithOwner:self options:nil];
        cell = self.TbvCell;
        [cell.CheckmarkButton addTarget:self action:@selector(CheckmarkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        self.TbvCell = nil;
    }
    Order *order = [orderArray objectAtIndexPath:row];
    cell.order = order;
 }

Тогда в моем TableViewCell это примерно так:

@property (nonatomic, retain) Order *order;
@property (nonatomic, retain) UIImageView *icon;

переопределенный установщик:

- (void)setOrder:(Order *)newOrder {
    if (!order.showIcon) {
        icon.hidden = YES;
    } 
}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Ваш код повторно использует вашу ячейку, поэтому вы должны охватить все случаи в вашем методе setOrderПопробуйте:

- (void)setOrder:(Order *)newOrder {
    if (!order.showIcon) {
        icon.hidden = YES;
    } 
    else {
        icon.hidden = NO;
    }
}

Или проще:

- (void)setOrder:(Order *)newOrder {
    icon.hidden = !order.showIcon;
}
0 голосов
/ 14 декабря 2011

Да, dequeueReusableCellWithIdentifier хорошо работает с любыми пользовательскими подклассами UITableViewCell.Однако имейте в виду, что этот метод предназначен для экономии памяти, поэтому вам придется сделать следующее (даже с обычным UITableViewCells без подклассов): Этот метод возвращает уже используемый экземпляр UITableViewCell (или nil, если табличное представление нехватит клеток еще).Это означает, что ячейка не будет «пустой»;вам нужно очистить и заново установить все его свойства.Например, вы должны иметь возможность решить из соответствующего NSIndexPath ячейки, должен ли ее значок отображаться, и какое изображение значка вы бы хотели использовать вообще.Поэтому отредактируйте ваш код следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSUInteger row = [indexPath row];
  static NSString *OrderTableViewCellIdentifier = @"OrderTableViewCellIdentifier";
  OrderTableViewCell *cell = (OrderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OrderTableViewCellIdentifier];
  if (cell == nil) {
      UINib *cellNib = [UINib nibWithNibName:@"OrderTableViewCell" bundle:nil];
      [cellNib instantiateWithOwner:self options:nil];
      cell = self.TbvCell;
      [cell.CheckmarkButton addTarget:self action:@selector(CheckmarkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
      self.TbvCell = nil;
  }
  // set your cell's properties to default values.
  // e. g.: cell.showIcon = NO; and so on
  Order *order = [orderArray objectAtIndexPath:row];
  cell.order = order;
  // then do a recustomization using the NSIndexPath's -row and -section properties

}

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

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