如何在此用例中向UITableView
添加节标题和索引列表?
@IBOutlet var tableView: UITableView!
var detail: Detail? = nil
var list = [tabledata]()
let search = UISearchController(searchResultsController: nil)
override func viewDidLoad() {
super.viewDidLoad()
list = [
tabledata(name:"something".localized, sort:"sort.something".localized, id:"something.html"),
tabledata(name:"somethingelse".localized, sort:"sort.somethingelse".localized, id:"somethingelse.html"),
...
]
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "library", for: indexPath)
var data: tabledata
data = list[indexPath.row]
cell.textLabel!.text = data.name
return cell
}
现在的关键是要转换表数据。
就像用户将语言设置为英语一样,不需要排序;
但是如果语言设置为德语等,则必须将节标题应用于翻译后的表格。
有人能弄清楚如何从字典中调用节字母吗?
tabledata(section: "a", name:"anaconda".localized, sort:"sort.anaconda".localized, id:"anaconda.html")
请注意
name:
是实际的单元格名称,将是 .localized
sort:
必须帮助像单元格名称中的á
é
等字符正确排序(避免在字母末尾显示)id:
调用html文件位置以显示在detailViewController
中(“原因是必须翻译名称,我们希望在此处输入静态文本)节标题和索引列表的常规实现将导致类似
T // section header
translation // cell names
transmission
...
T // table in
Übersetzung // another language
Getriebe
...
也许会有一个
function()
,它将从section
获取所有tabledata
,并将它们分配给var sectionletters = ["A", "B", ...]
中的相应字母,但是这超出了我对初学者的了解。
感谢帮助!
答案 0 :(得分:2)
最简单的方法是使用小节:每个首字母对应一个小节。
首先,更新您的tableView(_:cellForRowAt:)
以处理节:节中的第一个单词对应于行值0。
段号对应于字母:A代表0,B代表1,...
在您的代码中,您正确地获得了一个旧单元格,但是必须更改设置文本的方式。您正在执行以下操作:cell.textLabel?.text = list[indexPath.row]
。但这将不起作用,因为对于节,indexPath.row
参数值不再是列表中幻影的索引:您的列表是一维数组,但是对于节,UIKit使用二维方式您是对虚影的引用:参数indexPath.row
现在是indexPath.section
部分中虚影的索引号。因此,如果列表中有4个虚名,例如“ axx”(第0部分,第0行),“ ayy”(第0部分,第1行),“ bxx”(第1部分,第0行)和“ byy” (第1节,第1行),引用“ bxx”的参数的值例如对于indexPath.section
为1,对于indexPath.row
为0。使用当前代码行,您将设置以下文本:list [0],因此为“ axx”。但是对应于第1节和第0行的是“ bxx”。
要获得正确的行为,您可以处理鬼的整个列表,将与indexPath.section
的字母相对应的鬼提取到另一个数组中,最后得到这个新数组的元素,该元素的索引为等于indexPath.row
。
但是,正如您所看到的,这比我们想要的要棘手得多。
轻松完成所有这些操作的最佳方法是更改数据源类型:使用二维数组,而不要使用[ghost]
类型的列表。
例如,您可以使用类似的内容:
var myNewDataSource : [String: [ghost]] = [
"A": [ghost1withNameStartingWithA, ghost2withNameStartingWithA, ...],
"B": [ghost1withNameStartingWithB, ghost2withNameStartingWithB, ...],
...
]
这样,一切都变得简单了。
现在,覆盖此功能,以包含26个字母或部分(如果您只想显示至少包含一个单词的字母,则可以自定义此功能):
override func numberOfSections(in tableView: UITableView) -> Int {
return 26
}
重写并正确实现此功能,以指示词典中某个节中有多少个单词:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
[ COMPUTE THE NUMBER OF ROWS/WORDS FOR THIS LETTER AND RETURN THE VALUE ]
}
然后返回一个字符串,其中包含每个部分的字母,以便在GUI中显示该字母:
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
[ RETURN THE LETTER CORRESPONDING TO THE SECTION: "A" for section 0, "B" for section 1, etc. ]
}
最后,根据您的屏幕快照,自定义部分,因为您似乎想要特定的背景颜色,可能是粗体或其他字体大小:
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
let header = view as! UITableViewHeaderFooterView
header.backgroundView?.backgroundColor = UIColor(red: 253.0/255.0, green: 240.0/255.0, blue: 196.0/255.0, alpha: 1)
header.textLabel?.textColor = .black
header.textLabel?.font = UIFont(name: "Helvetica-Bold", size: 19)
}
答案 1 :(得分:1)
有几种方法可以完成此操作。最简单的方法之一就是使用UITableView随附的委托函数。
出于组织目的,我将从创建一个代表节的类开始。像这样:
text = "42 0"
然后更新import re
numlist = re.findall('\d+',text)
print(numlist)
['42', '0']
变量以使用部分而不是原始项目列表:
class GhostSection {
// a title for this section
var sectionTitle: String
// a list of items for this particular section
var items: [Ghost] = []
init(title: String, items: [Ghost]) {
sectionTitle = title
self.items = items
}
}
理想情况下,我将从json对象创建我的GhostSection,但是如果必须手动完成,则可以执行以下操作:
list
我将var tabledata = [GhostSections]()
返回表数据计数,该计数将是节总数的计数:
// setup the table data to use GhostSection instances for each section
var tabledata = [
GhostSection(title: "a", items: [Ghost(name:"an".localized, sort:"sort.an".localized, id:"0101")]),
GhostSection(title: "b", items: [Ghost(name:"bc".localized, sort:"sort.bc".localized, id:"0102")]),
GhostSection(title: "c", items: [Ghost(name:"cd".localized, sort:"sort.cd".localized, id:"0103")])
]
和numberOfSections(in tableView: UITableView)
返回表数据数组中每个func numberOfSections(in tableView: UITableView) -> Int {
return tabledata.count
}
上每个numberOfRowsInSection
数组的列表计数:
items
然后,我将更新GhostSection
以返回该部分右侧单元格的信息:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tabledata[section].items.count
}
我还喜欢将标头创建为可重复使用的笔尖视图,因此ListHeaderView中仅带有标题标签:
cellForRow(at indexPath)
如果您想使用这种方法,这就是我实现func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "library", for: indexPath)
// this gets the section data, then gets the item from that section
var data = list[indexPath.section].items[indexPath.row]
cell.textLabel?.text = data.name
return cell
}
函数的方式,因此您可以实例化具有关联的.xib文件的任何视图:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
// this loads the view from the nib
guard let view = ListHeaderView.fromNib() as? ListHeaderView else {
return nil
}
// get the section object for this current section
let data = tabledata[section]
// and set the title label text here from our section object
view.titleLabel.text = data.sectionTitle
return view
}
// if you want to also have a custom footer you can do that here...
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return UIView()
}
// and let the header height be dynamic, or return a set height here...
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return UITableViewAutomaticDimension
}
还请注意,养成对类/对象名称使用驼峰式大小写的习惯的习惯,如果要与当前约定保持一致,则将首字母大写。因此,不用命名您的班级fromNib()
,而是养成public extension UIView {
public static func fromNib() -> UIView? {
let nibName = String(describing: self)
let bundle = Bundle(for: self)
let nib = UINib(nibName: nibName, bundle: bundle)
guard let view = nib.instantiate(withOwner: nil, options: nil).first as? UIView else {
print("Unable to instantiate nib named: \(nibName) in bundle: \(String(describing: bundle)) -- nib: \(String(describing: nib))")
return nil
}
return view
}
}
的习惯。对于变量,约定也是驼峰式,但以小写字母开头。