Two tables on one view in swift

15,266

Solution 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  
    }
}

Just a quick edit. You need to keep the delegate and datasource methods same and check which TableView instance is actually sending the message.

You cannot override the same method twice in a derived class.

Solution 2

First create two DataSource implemented classes First Data source

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
  }
}

Second Data source

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
 }
}

Set datasource to tableview in ViewController

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()
    }
}
Share:
15,266
samp17
Author by

samp17

Updated on July 30, 2022

Comments

  • samp17
    samp17 almost 2 years

    I have the following code to display two tables populated from two different arrays in one view:

    @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
        }
    

    I got the first table working, and then copied and pasted the text, replacing the array names and tableview names, and have hooked up the delegate and datasource. However Xcode displays 'invalid redeclaration of viewdidload' on the second (pasted) code. If I replace this to 'fund loadView() {' instead of viewdidload the app builds. When I test it though, both tables view exactly the same data which is the data in 'RFArray.' I am VERY new to coding and cannot see what I have done, please help.