UiTableView 以编程方式按部分组织项目
UiTableView organize items by section programmatically
我正在尝试根据位置对用户进行分组。
例如,纽约市的任何人都应该在表格视图的纽约市部分下,而洛杉矶的任何人都应该在该部分下。
//Sets up the sections
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
//Sets the header view
guard let header = view as? UITableViewHeaderFooterView
else {
return
}
//Sets the properties.
view.tintColor = ChatMessageCell.indexedColor
header.textLabel?.textColor = UIColor.white
header.textLabel?.font = UIFont(name: "Open Sans Bold", size: 11)
header.backgroundColor = ChatMessageCell.indexedColor
header.textLabel?.textAlignment = .center
//Sets the variable headerText = to the text labels header
self.headerText = header.textLabel?.text!
}
我创建了一个名为 headerText 的变量,用于存储 header 的文本标签。
在 numberOfRowsInSection 中,我将用户的位置与 header 标题进行比较。如果它们匹配,我 return 用户,但如果它们不匹配,则不应 returned
//Sets the number of rows equal to the amount of Users.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//Observes the users (Firebase
refHandle = ref.child("Users").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String : AnyObject]{
let user = Users()
user.id = snapshot.key
user.setValuesForKeys(dictionary)
//If statement to see if their location is equal to header it should be under
//This array is empty + meant to store only the users whose location is equal to the section title
if user.location == self.headerText{
return user
}
else{
return 0
}
}
})
}
我认为您的代码有两个问题:
- 要创建/修改 header 视图,您应该实施
viewForHeaderInSection
(而不是在 willDisplayHeaderView
中执行)
- 您应该不存储某种当前header的状态数据(如
headerText
)。这在很大程度上取决于 table 显示 header 和单元格的顺序的框架实现细节。
因此您需要不同的方法来访问您的 grouping/header 条件和访问单元格数据。
一个简单的例子:
- 首先,您将计算部分/位置(在
viewDidLoad
或 viewDidAppear
中的某处),按字母顺序对它们进行排序并将它们存储在一个名为 e.g. 的数组中。 locations
或不知何故。
- 在
numberOfRowsInSection
中,您 return 位置的数量(例如 locations.count
- 在
viewForHeaderInSection
中,您将检索属于所提供部分的数据,例如return locations[section]
- 在
numberOfRowsInSection
中,您将计算属于给定部分的用户数
- 在
cellForRow
中,您将计算 return 包含用户数据的单元格。
我正在尝试根据位置对用户进行分组。 例如,纽约市的任何人都应该在表格视图的纽约市部分下,而洛杉矶的任何人都应该在该部分下。
//Sets up the sections
override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
//Sets the header view
guard let header = view as? UITableViewHeaderFooterView
else {
return
}
//Sets the properties.
view.tintColor = ChatMessageCell.indexedColor
header.textLabel?.textColor = UIColor.white
header.textLabel?.font = UIFont(name: "Open Sans Bold", size: 11)
header.backgroundColor = ChatMessageCell.indexedColor
header.textLabel?.textAlignment = .center
//Sets the variable headerText = to the text labels header
self.headerText = header.textLabel?.text!
}
我创建了一个名为 headerText 的变量,用于存储 header 的文本标签。 在 numberOfRowsInSection 中,我将用户的位置与 header 标题进行比较。如果它们匹配,我 return 用户,但如果它们不匹配,则不应 returned
//Sets the number of rows equal to the amount of Users.
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//Observes the users (Firebase
refHandle = ref.child("Users").observe(.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String : AnyObject]{
let user = Users()
user.id = snapshot.key
user.setValuesForKeys(dictionary)
//If statement to see if their location is equal to header it should be under
//This array is empty + meant to store only the users whose location is equal to the section title
if user.location == self.headerText{
return user
}
else{
return 0
}
}
})
}
我认为您的代码有两个问题:
- 要创建/修改 header 视图,您应该实施
viewForHeaderInSection
(而不是在willDisplayHeaderView
中执行) - 您应该不存储某种当前header的状态数据(如
headerText
)。这在很大程度上取决于 table 显示 header 和单元格的顺序的框架实现细节。
因此您需要不同的方法来访问您的 grouping/header 条件和访问单元格数据。
一个简单的例子:
- 首先,您将计算部分/位置(在
viewDidLoad
或viewDidAppear
中的某处),按字母顺序对它们进行排序并将它们存储在一个名为 e.g. 的数组中。locations
或不知何故。 - 在
numberOfRowsInSection
中,您 return 位置的数量(例如locations.count
- 在
viewForHeaderInSection
中,您将检索属于所提供部分的数据,例如return locations[section]
- 在
numberOfRowsInSection
中,您将计算属于给定部分的用户数 - 在
cellForRow
中,您将计算 return 包含用户数据的单元格。