如何将多个项目添加到 UITableViewCell?
Posted
技术标签:
【中文标题】如何将多个项目添加到 UITableViewCell?【英文标题】:How to add multiple items to a UITableViewCell? 【发布时间】:2020-06-23 19:48:07 【问题描述】:谁能帮我让email
字段显示在tableView
单元格中? amount
字段正在显示,但我无法让 email
与它一起显示。
struct Posts
var amount:String
var email:String
class PaymentRequestVC: UIViewController, UITableViewDelegate
let tableView = UITableView()
var posts = [Posts]()
override func viewDidLoad()
super.viewDidLoad()
view.backgroundColor = .white
self.tableView.dataSource = self
self.tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell2")
tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 900)
setupViews()
setupTableView()
loadPosts()
self.tableView.reloadData()
func loadPosts()
let dbUsers = Firestore.firestore().collection("Payouts")
dbUsers.addSnapshotListener (querySnapshot, error) in
if let error = error
print("\(error.localizedDescription)")
else
for document in (querySnapshot?.documents)!
if let Amount = document.data()["amount"] as? String
let Email = document.data()["email"] as? String
print(Amount)
var post = Posts(amount: "", email: "")
post.amount = Amount
post.email = Email ?? ""
self.posts.append(post)
self.tableView.reloadData()
print(self.posts)
private func setupViews()
let stackView: UIStackView =
let sv = UIStackView()
sv.translatesAutoresizingMaskIntoConstraints = false
sv.spacing = 28
sv.axis = .vertical
sv.distribution = .fill
sv.alignment = .fill
return sv
()
view.addSubview(stackView)
view.addSubview(tableView)
func setupTableView()
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
tableView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
tableView.leftAnchor.constraint(equalTo: self.view.leftAnchor)
])
extension PaymentRequestVC: UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return posts.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row < posts.count
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let post = posts[indexPath.row]
cell.textLabel?.text = post.amount
cell.textLabel?.textColor = UIColor.black
return cell
else
let cell2 = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath)
let post = posts[indexPath.row]
cell2.detailTextLabel?.text = post.email
cell2.detailTextLabel?.textColor = UIColor.black
return cell2
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 80
【问题讨论】:
【参考方案1】:斯威夫特 5
您需要使用 UITableViewCell.CellStyle.subtitle 初始化单元格,以便 detailTextLabel 属性起作用。
在您的扩展程序中,更改 cell init:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row < posts.count
let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
let post = posts[indexPath.row]
cell.textLabel?.text = post.amount
cell.textLabel?.textColor = UIColor.black
cell.detailTextLabel?.text = post.email
cell.detailTextLabel?.textColor = UIColor.black
return cell
else
let cell2 = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell2")
let post = posts[indexPath.row]
cell2.detailTextLabel?.text = post.email
cell2.detailTextLabel?.textColor = UIColor.black
return cell2
请注意,如果您希望 amount 和 mail 同时显示,使用 else 将仅显示金额或电子邮件, 就像在下面的代码中
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row < posts.count
let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
let post = posts[indexPath.row]
cell.textLabel?.text = post.amount
cell.textLabel?.textColor = UIColor.black
return cell
else
let cell2 = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell2")
let post = posts[indexPath.row]
cell2.detailTextLabel?.text = post.email
cell2.detailTextLabel?.textColor = UIColor.black
return cell2
所以更好的方法是同时返回,else什么都不显示
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row < posts.count
let cell = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell")
let post = posts[indexPath.row]
cell.textLabel?.text = post.amount
cell.textLabel?.textColor = UIColor.black
cell.detailTextLabel?.text = post.email
cell.detailTextLabel?.textColor = UIColor.black
return cell
else
let cell2 = UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "cell2")
//Empty cell returned if the condition above is not fulfilled
return cell2
希望这会有所帮助。
【讨论】:
【参考方案2】:我认为您在 cellForRowAt 中的逻辑不正确。
您有一个帖子数组。你想在同一个单元格中显示金额和电子邮件吗?一个标签是标题,另一个是详细文本。
两个标签都在同一个 UITableViewCell 中,所以每个帖子只需要设置一次。
此外,如果 indexPath.row 大于帖子计数,则 posts[indexPath.row] 实际上会使您的代码崩溃。所以 else 语句实际上应该只记录一个错误或什么都不做。
试试这样的:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row < posts.count
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let post = posts[indexPath.row]
cell.textLabel?.text = post.amount
cell.textLabel?.textColor = UIColor.black
cell.textLabel?.detailTextLabel?.text = post.email
cell.textLabel?.detailTextLabel?.textColor = UIColor.black
return cell
else
// No cells
【讨论】:
以上是关于如何将多个项目添加到 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章
当检查可以是字符串数组中的一个或多个项目时,如何将列表视图项目添加到数组中?