这就是我要做的。
我想要里面的tableview
,返回动态计数。
例如,第一个单元格中的3行,第二个单元格中的2行,第三个单元格中的4行...像这样。
在tableview
之外的数字也是动态的。
我应该返回tableView
个单元格计数吗?
答案 0 :(得分:0)
您可以这样创建数据源:
class TableViewDataSource {
var outerTVDatasource: [OuterTableViewDataSource]?
}
class OuterTableViewDataSource {
var insideTVDatasource: [InsideTableViewDataSource]?
}
class InsideTableViewDataSource {
}
,在具有父表视图的主视图控制器中,将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处理内部tableview
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
}
答案 1 :(得分:0)
我认为您应该为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 {
}
答案 2 :(得分:0)
查看此博客文章以获取详细信息: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
}
}