我正在尝试使用TableView中的部分创建一个应用程序。
但实际上,我不知道如何管理部分。
我创建了部分并且它工作正常但是当我尝试在我的部分中添加新行时,我遇到了问题。
示例:
我在第一部分中创建了一个新项目。
部分名称为“Aucun”,行标签将设置为“测试1”
有效!
所以,现在我想添加其他内容
部分名称为“Produits Laitiers”,行标签为“Test2”
失败:(该部分已创建,但排不是好的
目前有我的代码
func numberOfSections(in tableView: UITableView) -> Int {
return arraySection.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return arraySection[section]
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return numberOfRowsInSection[section]
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "customCell")
cell?.textLabel?.text = "\(String(describing: products[indexPath.row]["Name"]!))"
cell?.textLabel?.adjustsFontSizeToFitWidth = true
cell?.textLabel?.font = UIFont(name: "Arial", size: 14)
return cell!
}
numberOfRowsInSection是一个int数组,其中我存储了必须在此部分中的产品数。
答案 0 :(得分:2)
我认为问题在于UITableViewDataSource
方法cellForRowAt
中的products数组。您正在使用
products[indexPath.row]["Name"]!
您可能需要调整模型以处理indexPath.section
。
答案 1 :(得分:0)
我要做的第一件事是创建一个Section
模型来跟踪这些部分,如下所示:
/// Defines a section in data source
struct Section {
// MARK: - Properties
/// The title of the section
let title: String
/// The items in the section
var items: [String]
}
然后我将使用带有添加右键的UITableViewController
向UITableView
插入新的部分/行,添加我要使用的新部分/行一个UIAlertController
为了简洁起见,里面有两个UITextField
,你需要在这里放置部分的名称和行的名称。最后应该如下图所示:
如果该部分已存在,则将新行添加到该部分,否则,将动态创建新部分和行。
<强> DynamicTableViewController 强>
class DynamicTableViewController: UITableViewController {
// MARK: - Properties
/// The data source for the table view
var dataSource = [Section(title: "Section 1", items: ["Row 1"])]
// MARK: - UIViewController
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return dataSource.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource[section].items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = dataSource[indexPath.section].items[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return dataSource[section].title
}
@IBAction func didTapAddButton(_ sender: Any) {
presentAlerController()
}
}
extension DynamicTableViewController {
func add(_ sectionName: String?, _ row: String?) {
guard let name = sectionName, let rowName = row,
!name.isEmpty, !rowName.isEmpty else {
return
}
if let index = dataSource.index(where: { $0.title == name }) {
dataSource[index].items.append(rowName)
} else {
dataSource.append(Section(title: name, items: [rowName]))
}
tableView.reloadData()
}
func presentAlerController() {
let alertController = UIAlertController(title: "Add", message: "Add new Section/Row", preferredStyle: .alert)
let addAction = UIAlertAction(title: "Add", style: .default) { [weak self] _ in
let sectionTextField = alertController.textFields![0] as UITextField
let rowTextField = alertController.textFields![1] as UITextField
self?.add(sectionTextField.text, rowTextField.text)
}
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) { _ in }
alertController.addTextField { textField in
textField.placeholder = "Add a new section name"
}
alertController.addTextField { textField in
textField.placeholder = "Add a new row"
}
alertController.addAction(addAction)
alertController.addAction(cancelAction)
present(alertController, animated: true, completion: nil)
}
}
在上面的例子中,我没有检查是否存在重复行,你可以很容易地做到这一点。此外,我正在使用reloadData()
,但如果您愿意,也可以使用:
// insert the new section with row of the row in the existent section
tableView.beginUpdates()
// insert new section in case of any
insertSections(_ sections: IndexSet, with animation: UITableViewRowAnimation)
// insert new row in section using:
// insertRows(at: [IndexPath], with: UITableViewRowAnimation)
tableView.endUpdates()
此外,您需要创建一个新的UIBarButtonItem
并将其连接到@IBAction
我创建它以便能够呈现UIAlertController
并向{{1添加新的部分/行}}
我希望这会对你有所帮助。