将索引列表和节标题添加到已翻译的tableview中

时间:2018-08-02 22:32:39

标签: swift tableview

如何在此用例中向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", ...]中的相应字母,但是这超出了我对初学者的了解。

翻译后的表格视图的正确模型是什么?

感谢帮助!

2 个答案:

答案 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 } } 的习惯。对于变量,约定也是驼峰式,但以小写字母开头。