简体   繁体   English

如何使用两个自定义 UITableViewCell 在一个视图控制器中创建两个表视图?

[英]How do I create two table views in one view controller with two custom UITableViewCells?

I am trying to create two UITableViews in one view controller using two custom UITableViewCells .我试图创建两个UITableViews使用两个自定义在一个视图控制器UITableViewCells I have the following:我有以下几点:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if tableView == self.tableView {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomOne") as! CustomOneTableViewCell
        return cell
    }

    if tableView == self.autoSuggestTableView {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomTwo") as! CustomTwoTableViewCell
        return cell
    }
}

But I keep getting the error:但我不断收到错误消息:

Missing return in a function expected to return 'UITableViewCell'

What do I have to return in the end of the method?在方法结束时我必须返回什么?

The error appears because if for any reason, the table view is non of the two options that you wrote, then it doesn't have any value to return, just add a default value at the end:出现错误是因为如果出于任何原因,表视图不是您编写的两个选项,那么它没有任何返回值,只需在最后添加一个默认值:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == firstTableView,
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomOne") as? CustomOneTableViewCell {
        return cell
    } else if tableView == autoSuggestTableView,
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTwo") as? CustomTwoTableViewCell {
        return cell
    }

    return UITableViewCell()
}

Updated to swift 4.1.2: I've updated this answer to version 4.1.2 , also, because the return value of the method cannot be nil , modified to a default, dummy UITableViewCell .已更新至4.1.2迅速:我已经更新了这个答案版本4.1.2 ,同时,因为return value的方法不能nil ,修改为默认情况下,虚拟UITableViewCell

Your issue is that the compiler looks at the possibility that both if statements might be false and you don't return anything in that case, hence the error.您的问题是编译器会考虑if语句都可能为假并且在这种情况下您不返回任何内容的可能性,因此会出现错误。

If you only have the two tables, the easiest change is this:如果您只有两个表,最简单的更改是:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if tableView == self.tableView {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomOne") as! CustomOneTableViewCell
        return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomTwo") as! CustomTwoTableViewCell
        return cell
    }
}

My preferred solution to this problem would be to do the following:我对这个问题的首选解决方案是执行以下操作:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cellToReturn = UITableViewCell() // Dummy value
    if tableView == self.tableView {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomOne") as! CustomOneTableViewCell
        cellToReturn = cell
    } else if tableView == self.autoSuggestTableView {
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomTwo") as! CustomTwoTableViewCell
        cellToReturn = cell
    }

    return cellToReturn
}

I think this method maintains readability and clarity whilst also solving the error.我认为这种方法保持了可读性和清晰度,同时也解决了错误。 I don't like having (dangerous) code written only for compatibility like return nil .我不喜欢只为了兼容性而编写(危险的)代码,例如return nil

If you try two or more than two table in ViewController.then you must be identify tableView in all delegates and dataSource methods.如果您在 ViewController 中尝试使用两个或两个以上的表,那么您必须在所有委托和数据源方法中识别 tableView。 for example例如

extension ViewController: UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableView == firstTableView ? first.count: second.count
        //return second.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var returnCell = UITableViewCell()
        if tableView == firstTableView {
            let cell = tableView.dequeueReusableCell(withIdentifier: "firstCell", for: indexPath)
            cell.textLabel?.text = first[indexPath.row]
            returnCell = cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "secondCell", for: indexPath)
            cell.textLabel?.text = second[indexPath.row]
            returnCell = cell
        }
        return returnCell
    }
}

Building off of Fantini's answer, I would suggest using a switch statement to clean it up a bit:基于 Fantini 的回答,我建议使用 switch 语句来清理一下:

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

  switch tableView {

    case firstTableView:
      let cell = tableView.dequeueReusableCell(withIdentifier: "CustomOne") as? CustomOneTableViewCell {
      return cell

    case autoSuggestTableView:
      let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTwo") as? CustomTwoTableViewCell {
      return cell

    default:
      return UITableViewCell()
  }
}

Just in case you plan on adding more tableView's later.以防万一您打算稍后添加更多 tableView。

import UIKit导入 UIKit

class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource {类视图控制器: 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
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM