我正在尝试将行动态插入UItableview中,以允许用户输入列表。插入新行直到我到达表格视图的底部为止。当我到达最底端时,由于单元格类型错误,将触发致命错误,这似乎是由于未执行insert语句引起的。
这是表格视图的代码:
//
// TextEntryViewController.swift
// GroceryPlanner
//
// Created by Taygan Caldwell on 1/18/19.
// Copyright © 2019 None. All rights reserved.
//
import UIKit
class TextEntryViewController: UIViewController,UITextFieldDelegate,UITableViewDataSource,UITableViewDelegate {
//MARK: Properties
@IBOutlet weak var save: UIBarButtonItem!
@IBOutlet weak var tableView: UITableView!
var enteredItems=[String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource=self
tableView.delegate=self
// Do any additional setup after loading the view.
updateSaveButton()
}
//MARK: TableView Methods
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return enteredItems.count+1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIndentifier="InputTableViewCell"
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIndentifier, for: indexPath) as? InputTableViewCell else{
fatalError("wrong cell type")
}
cell.input.delegate=self
cell.input.tag=indexPath.row
if indexPath.row < enteredItems.count{
cell.input.text=enteredItems[indexPath.row]
}
return cell
}
//MARK: UITextFieldDelegate
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
let indexPath=IndexPath(row:enteredItems.count ,section:0)
tableView.insertRows(at: [indexPath], with: .automatic)
guard let cell=tableView.cellForRow(at: indexPath) as? InputTableViewCell else{
fatalError("wrong cell type")
}
cell.input.becomeFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
textField.resignFirstResponder()
if textField.text != ""{
enteredItems.insert(textField.text!, at: enteredItems.count)
}
//refresh table
/*
self.tableView.reloadData()
let cell=getCell(enteredItems.count)
if cell.input.text != ""{
cell.input.text=""
}
*/
//enable save button if there is a least one item
updateSaveButton()
}
func textFieldDidBeginEditing(_ textField: UITextField) {
let index=textField.tag
let cell=getCell(index)
cell.becomeFirstResponder()
if index < enteredItems.count{
enteredItems.remove(at: index)
}
}
//MARK: Navigation
@IBAction func cancel(_ sender: Any) {
dismiss(animated: true, completion: nil)
}
// This method lets you configure a view controller before it's presented.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let button=sender as? UIBarButtonItem, button===save else{
print("save button not pressed")
return
}
}
//MARK: Private Methods
private func updateSaveButton(){
save.isEnabled = !enteredItems.isEmpty
}
private func getCell(_ index:Int)->InputTableViewCell{
let indexPath=IndexPath(row: index,section:0)
guard let cell=tableView.cellForRow(at: indexPath) as? InputTableViewCell else{
fatalError("wrong cell type")
}
return cell
}
}
答案 0 :(得分:1)
这应该在方法insertRows
if textField.text != ""{
enteredItems.insert(textField.text!, at: enteredItems.count)
}
当您按回车键func textFieldDidEndEditing(_ textField: UITextField)
答案 1 :(得分:0)
更新 4. cellForRowAtIndexpath仅给出可见的单元格。 5.如果tableview到达底部,则在每次插入时都必须调用tableview.scrollToBottom。那么您可以获取最后一个索引路径的单元格
通过这种方式,您不会陷入致命错误。