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
How do I create two table views in one view controller with two custom UITableViewCells?
提问by butter_baby
I am trying to create two UITableViews
in 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 value
of 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 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
}
}
回答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。