Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Two tables on one view in swift

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.

like image 964
samp17 Avatar asked Oct 06 '14 11:10

samp17


2 Answers

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

like image 149
raz0r Avatar answered Dec 09 '22 09:12

raz0r


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()
    }
}
like image 28
Girish Ghoda Avatar answered Dec 09 '22 09:12

Girish Ghoda