我如何在swift 3中的一个viewcontroller中填充两个不同的tableview

时间:2018-01-03 19:51:19

标签: ios swift uitableview

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView == table1{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! acntTableViewCell
        cell.account.text = account[indexPath.row].email
        return cell
    }
    else if tableView == table2 {
        let cell2 = tableView.dequeueReusableCell(withIdentifier: "cell2")
            as! popTableViewCell

        cell2.pop.text = pop[indexPath.row].answer
        return cell2
    }
}//its give me  error here Missing return  in function

我将在一个viewcontroller中填充两个不同的表。当我返回单元格时它会给我错误错误返回函数我做错了可以任何人建议我这个代码有什么错误

6 个答案:

答案 0 :(得分:0)

编译器正在分析如果tableView既不是table1也不是table2会发生什么。如果发生这种情况,该函数将退出,不返回任何内容。

这是一个错误。

答案 1 :(得分:0)

您的cellForRowAt方法应该始终返回一个单元格,所以

试试这种方式

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if tableView == table1{
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! acntTableViewCell
        cell.account.text = account[indexPath.row].email
        return cell
    }
     //if tableView is not table1 then
    let cell2 = tableView.dequeueReusableCell(withIdentifier: "cell2")
            as! popTableViewCell

     cell2.pop.text = pop[indexPath.row].answer
     return cell2
}

答案 2 :(得分:0)

这两个答案都是正确的,但我认为最好的方法是将每个表视图分开以拥有自己的数据源对象,而不是视图控制器。放置多个tableview数据源协议会增加大量不必要的代码,如果将它们重构为单独的对象,则可以帮助避免使用Massive View Controller。

 class FirstTableViewDataSource : NSObject, UITableViewDataSource {

    var accounts: [ObjectTypeHere]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return accounts.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! AcntTableViewCell
        cell.account.text = accounts[indexPath.row].email
        return cell
    }

}

class SecondTableViewDataSource : NSObject, UITableViewDataSource {

    var pops: [ObjectTypeHere]

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return pops.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! PopTableViewCell
        cell.account.text = pops[indexPath.row].answer
        return cell
    }
}

从那里,只需更新tableviews以从这些对象中提取

override func viewDidLoad() {
    super.viewDidLoad()
    self.table1.dataSource = FirstTableViewDataSource()
    self.table2.dataSource = SecondTableViewDataSource()
}

答案 3 :(得分:0)

import UIKit

class ViewController: UIViewController {
@IBOutlet weak var table1: UITableView!
@IBOutlet weak var table2: UITableView!
let firstClassRef = FirstTableView()
let secondClassRef = SecondTableView()
override func viewDidLoad() {
    super.viewDidLoad()

   firstClassRef.array1 = ["1","2","3"]
    secondClassRef.array2 = ["1","2","3","1","2","3"]

    self.table1.dataSource = firstClassRef
    self.table2.dataSource = secondClassRef

    self.table1.delegate = firstClassRef
    self.table2.delegate = secondClassRef

    self.table1.reloadData()
    self.table2.reloadData()
 }
}

class FirstTableView: NSObject, UITableViewDataSource, UITableViewDelegate {
var array1 = Array<Any>()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return array1.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as UITableViewCell
    cell.textLabel?.text = array1[indexPath.row] as? String
    cell.backgroundColor = UIColor.yellow
    return cell
}
}

class SecondTableView: NSObject, UITableViewDataSource, UITableViewDelegate {
var array2 = Array<Any>()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return array2.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as UITableViewCell
    cell.textLabel?.text = array2[indexPath.row] as? String
    cell.backgroundColor = UIColor.yellow
    return cell
}
}

答案 4 :(得分:0)

首先,您应该使用===(引用)而不是==(比较)比较表。

这是断言失败是一种很好的方式来告诉编译器没有其他函数方式的情况之一,例如:

if tableView === table1 {
    return ...
} else if tableView === table2 {
    return ...
} else {
    fatalError("Invalid table")
}

您也可以使用switch

switch tableView {
   case table1:
       return ...
   case table2:
       return ...
   default:
       fatalError("Invalid table")
}

答案 5 :(得分:0)

使用Switch语句

import UIKit

class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource {
    @IBOutlet weak var topTableView: UITableView!
    @IBOutlet weak var downTableview: UITableView!
    var topData : [String] = []
    var downData = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        topTableView.delegate = self
        downTableview.delegate = self
        topTableView.dataSource = self
        downTableview.dataSource = self

        for index in 0...20 {
            topData.append("Top Table Row \(index)")
        }

        for index in 10...45 {
            downData.append("Down Table Row \(index)")
        }

    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var numberOfRow = 1
        switch tableView {
        case topTableView:
            numberOfRow = topData.count
        case downTableview:
            numberOfRow = downData.count
        default:
            print("Some things Wrong!!")
        }
        return numberOfRow
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
        switch tableView {
        case topTableView:
            cell = tableView.dequeueReusableCell(withIdentifier: "topCell", for: indexPath)
            cell.textLabel?.text = topData[indexPath.row]
            cell.backgroundColor = UIColor.green
        case downTableview:
            cell = tableView.dequeueReusableCell(withIdentifier: "downCell", for: indexPath)
            cell.textLabel?.text = downData[indexPath.row]
            cell.backgroundColor = UIColor.yellow
        default:
            print("Some things Wrong!!")
        }
        return cell
    }
}