Как создать динамическое представление таблицы внутри динамического просмотра таблицы в Swift? - PullRequest
0 голосов
/ 12 сентября 2018

Это то, что я хочу сделать.Я хочу tableview, который находится внутри, вернуть динамический счет.

Например, 3 строки в первой ячейке, 2 строки во второй ячейке, 4 строки в третьей ячейке ... вот так.

А также за пределами tableview число также является динамическим.

Что я должен вернуть tableView количество клеток?

enter image description here

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Я думаю, вы должны создать 2 источника данных для 2 табличных представлений. Примерно так:

final class YouViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    let outerModel: [Any] = []
    lazy var outerDatasource = OuterTableDatasource(model: self.outerModel)
    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.dataSource = outerDatasource
        self.tableView.delegate = outerDatasource

    }
}

final class CellThatContainTableView: UITableViewCell {
    @IBOutlet weak var tableView: UITableView!
    var dataSource: InnerTableDatasource! {
        didSet {
            self.tableView.dataSource = dataSource
            self.tableView.delegate = dataSource
        }
    }
    func configure(dataSource: InnerTableDatasource) {
        self.dataSource = dataSource
    }
}

final class OuterTableDatasource: NSObject {
    var model: [Any]
    init(model: [Any]) {
        self.model = model
    }
}

extension OuterTableDatasource: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //implement cell configuration
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CellThatContainTableView
        cell.configure(dataSource: InnerTableDatasource(model: []))
        return cell
    }


}
extension OuterTableDatasource: UITableViewDelegate {

}

final class InnerTableDatasource: NSObject {
    var model: [Any]
    init(model: [Any]) {
        self.model = model
    }
}

extension InnerTableDatasource: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //implement cell configuration
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!


        return cell
    }


}
extension InnerTableDatasource: UITableViewDelegate {

}
0 голосов
/ 12 сентября 2018

Проверьте этот блог для деталей : https://medium.com/@stasost/ios-how-to-build-a-table-view-with-multiple-cell-types-2df91a206429

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let item = items[indexPath.section]
   switch item.type {
   case .nameAndPicture:
      if let cell = tableView.dequeueReusableCell(withIdentifier: NamePictureCell.identifier, for: indexPath) as? NamePictureCell {
         cell.item = item
         return cell
      }
   case .about:
      if let cell = tableView.dequeueReusableCell(withIdentifier: AboutCell.identifier, for: indexPath) as? AboutCell {
         cell.item = item
         return cell
      }
   case .email:
      if let cell = tableView.dequeueReusableCell(withIdentifier: EmailCell.identifier, for: indexPath) as? EmailCell {
         cell.item = item
         return cell
      }
   case .friend:
      if let cell = tableView.dequeueReusableCell(withIdentifier: FriendCell.identifier, for: indexPath) as? FriendCell {
         cell.item = friends[indexPath.row]
         return cell
      }
   case .attribute:
      if let cell = tableView.dequeueReusableCell(withIdentifier: AttributeCell.identifier, for: indexPath) as? AttributeCell {
         cell.item = attributes[indexPath.row]
         return cell
      }
   }
   // return the default cell if none of above succeed
   return UITableViewCell()
}

You can use the same structure to setup the didSelectRowAt delegate method:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      switch items[indexPath.section].type {
          // do appropriate action for each type
      }
}
0 голосов
/ 12 сентября 2018

вы можете сделать свой источник данных следующим образом:

class TableViewDataSource {
   var outerTVDatasource: [OuterTableViewDataSource]?
}

class OuterTableViewDataSource {
   var insideTVDatasource: [InsideTableViewDataSource]?
}

class InsideTableViewDataSource {
}

и в главном viewcontroller, где у вас есть родительский просмотр таблицы, возвращайте numberOfRows как

class MainViewController: UIVIewController {
  var outerTableView: UITableView?
override func viewDidLoad() {
super.viewDidLoad()
outerTableView.delegate = self
outerTableView.dataSource = self
}
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return tableViewDataSourceObject.outerTVDatasource.count ?? 0
  }

//PseudoCode
func cellForRowAt() {
let cell = dequeue as? OuterTableViewCell
cell.dataSource =  tableViewDataSourceObject.outerTVDatasource
return cell
}

}

, чтобы ваш OuterTableViewCell обрабатывал внутренний просмотр таблицы

class OuterTableViewCell: UITableViewCell {

var innerTableView: UITableView?
var dataSource: OuterTableViewDataSource?

//psuedo code
awakeFromNib() {
innerTableView.delegate = self
innerTableView.datasource = self
}

    numberOfrow() {
return dataSource. insideTVDatasource.count
}
cellforrow() {
let cell = dequeue as? InnerTableViewCell
cell.dataSource = dataSource. insideTVDatasource
return cell
}


class InnerTableViewCell: UITableViewCell {
var dataSource: InsideTableViewDataSource
}
...