Включение раздела со «динамическими прототипами» в статическое представление таблицы со «статическими ячейками» - PullRequest
9 голосов
/ 16 февраля 2012

Я хочу определить статическое табличное представление с одним динамическим разделом Это возможно?

секция 0 должна быть статической, этикетки помечены в xcode с выходами.

раздел 1 должен быть динамическим

Я пробовал это, но я не знаю, какую ячейку я верну для статической части.

static NSString *CellIdentifier = @"ItemCellBasic";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

switch (indexPath.section)
{ case 0:
    return // I don´t know what

  case 1:
    cell.textLabel =@"dynamic";
    return cell;    
}

РЕДАКТИРОВАТЬ 1; сейчас я попробовал:

case 0: return [super tableView:tableView cellForRowAtIndexPath:indexPath];

но получил:

*** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:6072
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

Ответы [ 2 ]

5 голосов
/ 16 февраля 2012

У меня есть частичное решение этой проблемы

В методах источника данных табличного представления я возвращаю результат суперкласса для статических ячеек, для динамических ячеек я возвращаю необходимые динамические значения.

In - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath dequeueReusableCellWithIdentifier: возвращает ноль, поэтому я создаю новый UITableViewCell

Оставшаяся проблема:

в xcode вы должны указать количество строк в «динамическом разделе» (что, конечно, не является динамическим). Вы не можете отобразить больше, чем максимум, который вы здесь определили (или получите исключение; -)).

Samplecode:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{ 
  switch (section) 
  { case STATIC_SECTION:
      return  [super tableView:tableView numberOfRowsInSection:section];

    case DYNAMIC_SECTION
      return NUMBER_OF_DYNAMIC_ROWS; 
  }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"ItemCellBasic";
  UITableViewCell *cell; 

  switch (indexPath.section)
  {
    case STATIC_SECTION:
      return [super tableView:tableView cellForRowAtIndexPath:indexPath];

    case DYNAMIC_SECTION:
      cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
      if (!cell) 
      {  cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
      }

      cell.textLabel.text=DYNAMIC_TEXT;
      return cell;    
  }

}
0 голосов
/ 05 января 2015

вместо переключателя попробуйте использовать несколько старых добрых операторов if

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
       if(section==STATIC_SECTION){
           return  *the number of rows in the static section*
       }
       else{
           return NUMBER_OF_DYNAMIC_ROWS; 
       }
  }

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

    static NSString *CellIdentifier = @"ItemCellBasic";
    UITableViewCell *yourCell = [tableView dequeReusableCellWithIdentifier:CellIdentifier forIndexpath:indexPath];

    yourCell.text = *your dynamic text or something*

    return yourCell;
}

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

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