【问题标题】:Two tables on one view in swiftswift中一个视图上的两个表
【发布时间】:2014-10-06 11:40:55
【问题描述】:

我有以下代码在一个视图中显示从两个不同数组填充的两个表:

@IBOutlet var RFTable: UITableView
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

    }
    override func viewDidLoad() {
        super.viewDidLoad()

        self.RFTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
    }
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return self.RFArray.count;
    }
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) ->     UITableViewCell! {
        var cell:UITableViewCell = self.RFTable.dequeueReusableCellWithIdentifier("cell") as     UITableViewCell

        cell.textLabel.text = String(self.RFArray[indexPath.row])

        return cell
    }

    @IBOutlet var IMProdTable: UITableView
    func tableView2(IMProdTable: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!)     {

    }
    override func viewDidLoad() {
        super.viewDidLoad()

        self.IMProdTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell2")
    }
    func tableView2(IMProdTable: UITableView!, numberOfRowsInSection section: Int) -> Int {
    return self.IMProdArray.count;
    }
    func tableView2(IMProdTable: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) ->     UITableViewCell! {
        var cell2:UITableViewCell = self.IMProdTable.dequeueReusableCellWithIdentifier("cell2") as UITableViewCell

        cell2.textLabel.text = String(self.IMProdArray[indexPath.row])

        return cell2
    }

我得到了第一个表,然后复制并粘贴了文本,替换了数组名称和表视图名称,并连接了委托和数据源。但是 Xcode 在第二个(粘贴的)代码上显示“无效的 viewdidload 重新声明”。如果我将其替换为 'fund loadView() {' 而不是 viewdidload 应用程序构建。但是,当我对其进行测试时,两个表都查看了完全相同的数据,即“RFArray”中的数据。我对编码很陌生,看不到我做了什么,请帮忙。

【问题讨论】:

    标签: swift uitableview ios8


    【解决方案1】:
    @IBOutlet var RFTable: UITableView
    @IBOutlet var IMProdTable: UITableView
    
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.RFTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
        self.IMProdTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell2")
    }
    
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
      if tableView == RFTable {
        return self.RFArray.count;
      } else {
        return self.IMProdArray.count;
      }
    }
    
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) ->     UITableViewCell! {
      if tableView == RFTable {
        var cell:UITableViewCell = self.RFTable.dequeueReusableCellWithIdentifier("cell") as     UITableViewCell
        cell.textLabel.text = String(self.RFArray[indexPath.row])
        return cell
      } else {
        var cell2:UITableViewCell = self.IMProdTable.dequeueReusableCellWithIdentifier("cell2") as UITableViewCell
        cell2.textLabel.text = String(self.IMProdArray[indexPath.row])
        return cell2  
        }
    }
    

    只是一个快速的编辑。您需要保持委托和数据源方法相同,并检查哪个 TableView 实例实际发送消息。

    您不能在派生类中两次覆盖相同的方法。

    【讨论】:

    • 非常感谢,这很有道理,感谢您的解释。第一次工作
    【解决方案2】:

    首先创建两个DataSource实现的类 第一个数据源

    class FirstDataSouce: NSObject,UITableViewDataSource,UITableViewDelegate {
    
        var items: [String] = []
    
    
       override init(){
           super.init()
       }
    
       func setData(items:[String]){
           self.items = items
       }
    
    
    
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
      }
    
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RecentTableViewCell") as! RecentTableViewCell
    
            cell.titleLabel.text = items[indexPath.row]
    
        return cell
      }
    }
    

    第二个数据源

    class SecondDataSouce: NSObject,UITableViewDataSource,UITableViewDelegate {
    
        var items: [String] = []
    
    
       override init(){
           super.init()
       }
    
      func setData(items:[String]){
          self.items = items
      }
    
    
    
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          return items.count
      }
    
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RecentTableViewCell") as! RecentTableViewCell
    
            cell.titleLabel.text = items[indexPath.row]
    
         return cell
     }
    }
    

    在ViewController中设置数据源为tableview

    class ViewController: UIViewController{
        @IBOutlet weak var tableView1: UITableView!
        @IBOutlet weak var tableView2: UITableView!
    
        var dataSource1: FirstDataSouce!
        var dataSource2: SecondDataSouce!
    
        func prepareTableViews(){
    
            let items1 = [“a”,”b”,”c”]
            dataSource1 = FirstDataSouce()
            dataSource1.setData(items: items1)
            self.tableView1.dataSource = dataSource1
            self.tableView1.delegate = dataSource1
            self.tableView1.register(SelectorTableViewCell.self,
                                       forCellReuseIdentifier: 
                                                         "TableViewCell")
            self.tableView1.tableFooterView = UIView()
    
            let items2 = [“1”,”2”,”3”]
            dataSource2 = SecondDataSouce()
            dataSource2.setData(items: items2)
            self.recentTableView.dataSource = dataSource2
            self.recentTableView.delegate = dataSource2
            self.recentTableView.register(RecentTableViewCell.self,
                                              forCellReuseIdentifier: 
                                                         "TableViewCell")
            self.recentTableView.tableFooterView = UIView()
        }
    }
    

    【讨论】:

      【解决方案3】:

      还要确保在将数据提取到 TableviewCell 后重新加载每个 TableView。

      例如

      @IBOutlet var RFTable: UITableView
      @IBOutlet var IMProdTable: UITableView
      
      override func viewDidLoad() {
      
          super.viewDidLoad()
          self.RFTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell1")
          self.IMProdTable.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell2")
      
          RFTable.reloadData()
          IMProdTable.reloadData()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-22
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多