2016-01-12 4 views
0

Я работаю над проектом на основе IOS Swift, который использует несколько классов для настройки UITableView и UITableViewCell. Теперь одна из моих ячеек внутри UITableView имеет внутренний UITableView. Мне было интересно, возможно ли это, если внутри cellForRowAtIndexPath, что я мог бы также заполнить ячейки программным способом в этом же процессе.Программно заполняется UITableViewCells - Swift

EX:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomTableViewCell 
    ...... do stuff 
    cell.detailview.uitableview <!-- populate the cells here? 
    ....... 
    return cell 
} 

Предложения?

+0

https://github.com/angelvasa/AVLighterTableViewController –

ответ

1

Предполагая, что три различных типа клеток:

  • class NormalTableViewCell: UITableViewCell: Это используется для «обычных» клеток вашего внешнего (основного) представления таблицы.
  • class TableContainingTableviewCell : UITableViewCell: Это используется для «специальных» ячеек вашего внешних (основного) вида таблицы, которые содержат внутренний вид таблицы (внутри).

  • class InnerTableViewCell : UITableViewCell: Используется для ячеек ваших внутренних табличных представлений (содержащихся в ячейках класса TableContainingTableviewCell).

(Заменить каждый вашими реальными именами классов).

, вы можете использовать этот код:

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    // This can also be done in storyboard with prototype cells: 
    self.tableView.registerClass(NormalTableViewCell.class, forCellReuseIdentifier: normalCellIdentifier) 
    self.tableView.registerClass(TableContainingTableViewCell.class, forCellReuseIdentifier: specialCellIdentifier) 
} 

override func tableView(tableView: UITableView, 
    cellForRowAtIndexPath indexPath: NSIndexPath 
) -> UITableViewCell 
{ 
    if tableView == self.tableView { 
     // [A] OUTER TABLE VIEW 

     if indexPath == index path of table-containing cell { 
      // (A.1) TABLE-CONTAINING CELL 

      let cell = tableView.dequeueReusableCellWithIdentifier(specialCellIdentifier, forIndexPath: indexPath) as! TableContainingTableViewCell 

      // (...configure cell...) 

      // Setup and refresh inner table view: 

      cell.contentView.tableView.dataSource = self 

      // This is needed for dequeueing to succeed: 
      cell.contentView.tableView.registerClass(InnerTableViewCell.class, forCellReuseIdentifier: innerCellIdentifier) 

      cell.contentView.tableView.reloadData() 
      //^THIS TRIGGERS A CALL TO THIS FUNCTION, ON THE 
      // INNER TABLE VIEW (PATH [B] BELOW) 

      return cell 
     } 
     else { 
      // (A.2) NORMAL CELL 

      let cell = tableView.dequeueReusableCellWithIdentifier(normalCellIdentifier, forIndexPath: indexPath) as! NormalTableViewCell 

      // (configure cell) 

      return cell 
     } 
    } 
    else { 
     // [B] INNER TABLE VIEW 

     let cell = tableView.dequeueReusableCellWithIdentifier(innerCellIdentifier, forIndexPath: indexPath) as! InnerTableViewCell 

     // (configure cell)    

     return cell 
    } 
} 

... но я бы сильно спорить против того, представления таблицы внедренного внутри ячейки в целях другой таблицы. По крайней мере, убедитесь, что просмотр внутренней таблицы не требуется прокручивать (т. Е. Содержащая ячейка достаточно высока, чтобы отображать все строки, а сама таблица не имеет прокрутки).

+0

Хммм, мне кажется, что 'UITableView' вызывает мой основной контроллер. После заполнения моих ячеек, что 'UItableView', похоже, не вызывает 'cellForRowAtIndexPath' от родителя –

+0

Убедитесь, что ваш контроллер является' dataSource' ** обоих ** табличных представлений. –

+0

@nicolasMirari при добавлении 'cell.detailView.innertableView.dataSource = self;' который, кажется, сломает его, любая идея почему? –