私は維持するために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]
}
は、その後、私はを追加右buttoでUITableViewController
を使用する予定n新しいセクション/行をUITableView
に挿入するには、新しいセクション/行を追加します。UITextField
の内部に簡潔さのためにUIAlertController
を使用します。セクションの名前と行の名前を入れる必要があります。最後には、以下の画像のようになります。
は、セクションはすでにセクションに新しい行を追加しようとしているが存在する場合には、そうでない場合は、新しいセクションを作成し、動的に行うとしています。上記の例では
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
を作成し、私はUIAlertController
を提示することができるように作成@IBAction
に接続する必要があり、新しいセクション/行をUITableView
に追加してください。
私はこれがあなたを助けてくれることを願っています。
新しい行セクションを作成することはどういう意味ですか?行|セクションを動的に作成していますか? –
それはそれです。ユーザーが画面のようなものを入力すると、セクション/行が動的に追加されます – pierreafranck
このhttps://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/ManageInsertDeleteRow/ManageInsertDeleteRow.htmlを参照してください。 ? –