如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?
Posted
技术标签:
【中文标题】如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?【英文标题】:How to make Expandable with only Cells (NOT SECTION/ HEADER) with UITableView in Swift? 【发布时间】:2022-01-10 07:08:30 【问题描述】:我研究了有关可扩展表格视图的所有 ***,但他们只发布了带有单元格的显示标题。事实上,ios 15 已经改变了 UITableView 的新设计界面,称为.insetGrouped
。
基本上.insetGrouped
中的标题对于 Expandable 来说真的很糟糕。我试图让我的想法是只使用单元格来做可扩展而不需要部分。
我的表在这里查看代码:
class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
struct Object
var seactionName: String!
var seactionObjection: [String]!
var footerName: String!
var objectArray = [Object]()
var TableView = UITableView()
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
objectArray = [
Object(seactionName: "Header", seactionObjection: ["Expandable Cell", "One Row", "Two Row"],
footerName: "Footer"),
// copy and paste new cells
]
title = "Help Center"
view.backgroundColor = UIColor.quaternarySystemFill
TableView.frame = view.bounds
TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped)
TableView.showsVerticalScrollIndicator = true
TableView.indicatorStyle = .default
TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List")
TableView.delegate = self
TableView.dataSource = self
view.addSubview(TableView)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return objectArray[section].seactionObjection.count
func numberOfSections(in tableView: UITableView) -> Int
return objectArray.count
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return objectArray[section].seactionName
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String?
return objectArray[section].footerName
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell
cell.backgroundColor = .secondarySystemGroupedBackground
cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row]
cell.textLabel?.numberOfLines = 0
return cell
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
view.tintColor = .clear
let header = view as! UITableViewHeaderFooterView
header.textLabel?.textColor = UIColor.label
好吧,我可以更改此代码
cell.accessoryType = .disclosureIndicator
到这里
let disclosureIndicatorTapped = UIImageView()
disclosureIndicatorTapped.image = UIImage(systemName: "chevron.forward") // When tapped automatic to "Chevron.down"
cell.accessoryView = disclosureIndicatorTapped
知道如何使用 Swift 在 UITableView 中获取可扩展单元格,而不需要页眉或页脚吗?
谢谢!
【问题讨论】:
不清楚你要做什么......你想要.insetGrouped
的样子吗?或不?您想要每个部分的页眉和页脚吗?或者,您是否想要没有部分页眉/页脚,但您想点击部分中的第一行以展开/折叠该部分?如果您手动布局您希望表格的外观并发布它的屏幕截图,这可能会有所帮助。
我想要我的 TableView .insetgrouped。我不想以页脚为首展开/折叠。只有单元格可以像这样展开/折叠。
【参考方案1】:
您可以为您的对象添加一个布尔“扩展”属性。
在numberOfRowsInSection
中,如果expanded 为True,则返回seactionObjection
中的项目数,否则返回1
。
然后,在didSelectRowAt
中,如果它是某个部分的第一行,则切换该部分对象的expanded
属性,然后重新加载该部分。
这是您的控制器类的修改版本:
class HelpViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
struct Object
var seactionName: String!
var expanded: Bool!
var seactionObjection: [String]!
var footerName: String!
var objectArray = [Object]()
var TableView = UITableView()
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
objectArray = [
Object(seactionName: "Header 1",
expanded: false,
seactionObjection: ["Expandable Cell 1", "One Row 1", "Two Row 1"],
footerName: "Footer 1"),
Object(seactionName: "Header 2",
expanded: false,
seactionObjection: ["Expandable Cell 2", "One Row 2", "Two Row 2"],
footerName: "Footer 2"),
Object(seactionName: "Header 3",
expanded: false,
seactionObjection: ["Expandable Cell 3", "One Row 3", "Two Row 3"],
footerName: "Footer 3"),
// copy and paste new cells
]
title = "Help Center"
view.backgroundColor = UIColor.quaternarySystemFill
TableView.frame = view.bounds
TableView = UITableView(frame: self.view.bounds, style: UITableView.Style.insetGrouped)
TableView.showsVerticalScrollIndicator = true
TableView.indicatorStyle = .default
TableView.register(SliceCell.self, forCellReuseIdentifier: "Slice List")
TableView.delegate = self
TableView.dataSource = self
view.addSubview(TableView)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// if section is expanded
// return count of seactionObjection
// else
// return 1
return objectArray[section].expanded ? objectArray[section].seactionObjection.count : 1
func numberOfSections(in tableView: UITableView) -> Int
return objectArray.count
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return objectArray[section].seactionName
func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String?
return objectArray[section].footerName
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Slice List") as! SliceCell
cell.backgroundColor = .secondarySystemGroupedBackground
cell.textLabel?.text = objectArray[indexPath.section].seactionObjection[indexPath.row]
cell.textLabel?.numberOfLines = 0
// if it's the first row in a section,
// show accessoryView with
// chevron.up or chevron.down
// based on section Object expanded property
if indexPath.row == 0
let chevronName = objectArray[indexPath.section].expanded ? "chevron.up" : "chevron.down"
let img = UIImage(systemName: chevronName)
let disclosureView = UIImageView(image: img)
cell.accessoryView = disclosureView
else
// not the first row in a section, so
// clear the accessoryView
cell.accessoryView = nil
return cell
func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)
view.tintColor = .clear
let header = view as! UITableViewHeaderFooterView
header.textLabel?.textColor = UIColor.label
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
if indexPath.row == 0
objectArray[indexPath.section].expanded.toggle()
tableView.reloadSections([indexPath.section], with: .automatic)
else
// do something else on row selection
【讨论】:
我根据您的代码编写并了解如何工作!这更容易理解!非常感谢你,但是你忘记了这一点,你怎么能做.disclosureIndicator
到.disclosureIndicatorTapped
在点击单元格时显示,你会看到像cell.accessoryView
这样的右转。谢谢你!
@AntonioAdrianChavez - 在cellForRowAt
中,根据.row
决定是设置还是清除.accessoryView
,并根据部分对象的.expanded
属性决定使用哪个图像。我已经用一种方法编辑了我的答案,但我鼓励你先自己尝试一下……这可能是一次很好的学习体验。
顺便说一句:我知道那些 UITableViewController 基础代码很多年了,我使用了 UITableViewController。从 25 分钟开始,我就用你的简单代码更仔细地学习了。我开始明白了。 :) 嘿@DonMag,您认为建议使用带有 SF 符号的向上箭头和向下箭头,而不是向右箭头然后向下箭头?
@AntonioAdrianChavez - 这是一个设计问题,所以这取决于您作为应用设计师。就个人而言,当我看到一个右 V 形时,我希望它“去某个地方”。当我看到左雪佛龙时,我希望它会“回去”。对于展开/折叠类型的功能,我希望有上/下 V 形...或者,标有“展开/折叠”的按钮...或“更多/更少”按钮...或其他东西。
好的,明白了。非常感谢您提供一些提示和有用的答案! :)以上是关于如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用swift在ios中动态/编程添加多个UITableView? [关闭]
如何在 Swift 中使用 UITableView 仅使用单元格(不是部分/标题)进行扩展?
如何在 uilabel 中使用多行并根据 Swift 中的标签高度自动扩展 uitableview 行高?
如何在 Swift 中使用搜索栏过滤具有自定义单元格的 UITableView 的内容?