如何在swift中的动态表视图中创建动态表视图?

Posted

技术标签:

【中文标题】如何在swift中的动态表视图中创建动态表视图?【英文标题】:how to create dynamic tableview inside dynamic tableview in swift? 【发布时间】:2018-09-12 07:42:50 【问题描述】:

这就是我想做的。 我想要里面的tableview,返回动态计数。

例如,第一个单元格中的 3 行,第二个单元格中的 2 行,第三个单元格中的 4 行...像这样。

tableview 之外的计数也是动态的。

我应该返回什么tableView 单元格计数?

【问题讨论】:

如果您想在表格视图中进行表格视图,您应该分别处理每个表格视图委托。在单元格中,您应该订阅第二个表格视图并返回您需要的计数。 @biloshkurskyi.ss 您好,感谢您的回复。你能解释更多吗?我还不能理解;(你的意思是为里面的tableview创建tableview类吗? 我不明白,为什么你需要这样的功能。您可以使用具有多个部分的单个 tableview 来实现相同的目标。 @MehulThakkar 我可以同时制作动态部分和动态单元格吗? @poq :是的,为什么不呢。你可以 【参考方案1】:

我认为您应该为 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】:

你可以像这样制作你的数据源:

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

【讨论】:

我是否必须在 tableview 的数据源内部连接并委托与外部 tableview 相同的 viewcontroller? 我应该在哪里创建数据源?我必须创建另一个类吗?以及如何将它与内部 tableview 连接?? 谢谢你,但有些东西我听不懂。什么是 tableViewDataSourceObject?【参考方案3】:

查看这篇博文了解详情: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
      

【讨论】:

以上是关于如何在swift中的动态表视图中创建动态表视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中在动态 TableView 中创建动态 tableView?

如何在表视图中正确设置动态标题视图?

在mysql中,如何根据不同的表动态创建视图?

如何在 Google bigquery 中为多个动态表创建授权视图?

IOS表视图中的节数动态

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表