swift中一个视图上的两个表

时间:2014-10-06 11:40:56

标签: swift uitableview ios8

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

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

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

3 个答案:

答案 0 :(得分:12)

@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实例实际上正在发送消息。

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

答案 1 :(得分:4)

首先创建两个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()
    }
}

答案 2 :(得分:0)

还要确保在将数据提取到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()
}