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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37447124/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 09:10:14  来源:igfitidea点击:

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

iosswift

提问by butter_baby

I am trying to create two UITableViewsin one view controller using two custom UITableViewCells. I have the following:

我正在尝试UITableViews使用两个自定义UITableViewCells. 我有以下几点:

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?

在方法结束时我必须返回什么?

回答by Fantini

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 valueof the method cannot be nil, modified to a default, dummy UITableViewCell.

更新到 swift 4.1.2:我已经将这个答案更新到 version 4.1.2,也因为return value方法的 不能被nil修改为默认的 dummy UITableViewCell

回答by rmaddy

Your issue is that the compiler looks at the possibility that both ifstatements 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
    }
}

回答by Benjamin Lowry

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.

回答by Rakesh Kunwar

If you try two or more than two table in ViewController.then you must be identify tableView in all delegates and dataSource methods. for example

如果您在 ViewController 中尝试使用两个或两个以上的表,那么您必须在所有委托和数据源方法中识别 tableView。例如

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

回答by zaid afzal

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
}

}

}

回答by BaxiaMashia

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。