如何管理UITableView

时间:2017-08-11 13:23:08

标签: swift uitableview

我正在尝试使用TableView中的部分创建一个应用程序。

但实际上,我不知道如何管理部分。

我创建了部分并且它工作正常但是当我尝试在我的部分中添加新行时,我遇到了问题。

示例:

  

我在第一部分中创建了一个新项目。

enter image description here

  

部分名称为“Aucun”,行标签将设置为“测试1”

     

有效!

enter image description here

  

所以,现在我想添加其他内容

enter image description here

  

部分名称为“Produits Laitiers”,行标签为“Test2”

enter image description here

  

失败:(该部分已创建,但排不是好的

目前有我的代码

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数组,其中我存储了必须在此部分中的产品数。

2 个答案:

答案 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]
}

然后我将使用带有添加右键的UITableViewControllerUITableView插入新的部分/行,添加我要使用的新部分/行一个UIAlertController为了简洁起见,里面有两个UITextField,你需要在这里放置部分的名称和行的名称。最后应该如下图所示:

enter image description here

如果该部分已存在,则将新行添加到该部分,否则,将动态创建新部分和行。

  

<强> 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添加新的部分/行}}

我希望这会对你有所帮助。